了解实体框架下的多表结果
为了显示一个页面,我需要从各个表中获取大量信息,而目前,加载页面需要大约 20 秒,这太糟糕了。
因此,我想将所有内容移至一个存储过程中,并以旧的数据表方式获取所有信息。
我得到了这个
public WinnerPageInformation FindWinnerPageInformation(int calendarId)
{
BackendPagesContext ctx = new BackendPagesContext(db.Connection);
IMultipleResults results = ctx.WinnersBackendPageInformation(calendarId);
return new WinnerPageInformation()
{
Challenges = results.GetResult<Challenges>(),
Content = results.GetResult<ContentWinners>().FirstOrDefault(),
Einfo = results.GetResult<ContentEmails>().FirstOrDefault(),
Fields = results.GetResult<SubscriberFields>(),
Prizes = results.GetResult<Prizes>(),
Winners = results.GetResult<Winners>()
};
}
, WinnersBackendPageInformation 看起来像这样
public class BackendPagesContext : DataContext
{
public BackendPagesContext(System.Data.IDbConnection connection)
: base(connection) { }
[Function(Name = "dbo.sp_GetWinnersBackendPageInformation")]
[ResultType(typeof(JK_ContentWinners))]
[ResultType(typeof(JK_Winners))]
[ResultType(typeof(JK_SubscriberFields))]
[ResultType(typeof(JK_Prizes))]
[ResultType(typeof(JK_Challenges))]
[ResultType(typeof(JK_ContentEmails))]
public IMultipleResults WinnersBackendPageInformation(
[Parameter(Name = "calendarId", DbType = "Int")] int calendarId)
{
IExecuteResult result =
this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())),
calendarId);
return (IMultipleResults)(result.ReturnValue);
}
}
public interface IMultipleResults : IFunctionResult, IDisposable
{
IEnumerable<TElement> GetResult<TElement>();
}
,但我面临的问题是, this.ExecuteMethodCall
行抛出一个错误,指出结果不是 MultipleTable 结果。
我的存储过程看起来像
ALTER PROCEDURE sp_GetWinnersBackendPageInformation
@calendarId numeric = 0
AS
BEGIN
SELECT * FROM ContentWinners WHERE calendar_id = @calendarId;
SELECT * FROM Winners WHERE calendar_id = @calendarId;
SELECT * FROM SubscriberFields WHERE calendar_id = @calendarId ORDER BY position;
SELECT * FROM Prizes WHERE calendar_id = @calendarId ORDER BY prizetype_id, to_day, title;
SELECT * FROM Challenges WHERE calendar_id = @calendarId;
SELECT * FROM ContentEmails WHERE calendar_id = @calendarId;
END
GO
错误消息是
为函数“WinnersBackendPageInformation”声明的多个结果类型不返回 IMultipleResults。
我缺少什么?
In order to show a page I need to grab a lot information from various tables, and for now, it takes around 20 seconds to load the page, witch is terrible.
So I want to move everything into one Store Procedure and get all that info the old DataTable way.
I get this
public WinnerPageInformation FindWinnerPageInformation(int calendarId)
{
BackendPagesContext ctx = new BackendPagesContext(db.Connection);
IMultipleResults results = ctx.WinnersBackendPageInformation(calendarId);
return new WinnerPageInformation()
{
Challenges = results.GetResult<Challenges>(),
Content = results.GetResult<ContentWinners>().FirstOrDefault(),
Einfo = results.GetResult<ContentEmails>().FirstOrDefault(),
Fields = results.GetResult<SubscriberFields>(),
Prizes = results.GetResult<Prizes>(),
Winners = results.GetResult<Winners>()
};
}
and WinnersBackendPageInformation looks like this
public class BackendPagesContext : DataContext
{
public BackendPagesContext(System.Data.IDbConnection connection)
: base(connection) { }
[Function(Name = "dbo.sp_GetWinnersBackendPageInformation")]
[ResultType(typeof(JK_ContentWinners))]
[ResultType(typeof(JK_Winners))]
[ResultType(typeof(JK_SubscriberFields))]
[ResultType(typeof(JK_Prizes))]
[ResultType(typeof(JK_Challenges))]
[ResultType(typeof(JK_ContentEmails))]
public IMultipleResults WinnersBackendPageInformation(
[Parameter(Name = "calendarId", DbType = "Int")] int calendarId)
{
IExecuteResult result =
this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())),
calendarId);
return (IMultipleResults)(result.ReturnValue);
}
}
public interface IMultipleResults : IFunctionResult, IDisposable
{
IEnumerable<TElement> GetResult<TElement>();
}
but the problem I'm facing is that, the line this.ExecuteMethodCall
throws an error saying that the result is not a MultipleTable result.
my Store Procedure looks like
ALTER PROCEDURE sp_GetWinnersBackendPageInformation
@calendarId numeric = 0
AS
BEGIN
SELECT * FROM ContentWinners WHERE calendar_id = @calendarId;
SELECT * FROM Winners WHERE calendar_id = @calendarId;
SELECT * FROM SubscriberFields WHERE calendar_id = @calendarId ORDER BY position;
SELECT * FROM Prizes WHERE calendar_id = @calendarId ORDER BY prizetype_id, to_day, title;
SELECT * FROM Challenges WHERE calendar_id = @calendarId;
SELECT * FROM ContentEmails WHERE calendar_id = @calendarId;
END
GO
Error message is
More than one result type declared for function 'WinnersBackendPageInformation' that does not return IMultipleResults.
What am I missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你没有遗漏任何东西。
实体框架 4 不支持存储过程中的多个结果集。
如果您阅读博客文章 在这里,您会看到来自 EF 团队成员的以下声明:
,您可以使用一些“老式”ADO.NET,或者您可以尝试 CodePlex 似乎可以为您完成管道工作。
You're not missing anything.
Entity Framework 4 does not support multiple result sets in stored procedures.
If you read the blog post here, you'll find this statement from a member of the EF team:
So, you can use some "old-school" ADO.NET, alternatively you can try the EF Extensions project on CodePlex which appears to do the plumbing for you.