我在LinqPad中创建了一个测试查询,我不认为查询有什么特别之处,但它确实执行了存储在数据库中的函数。
我在这里包含了查询:
var opps = (from o in Entities.Table1
join oa in Entities.Table2 on o.Id equals oa.Table1Id
where (o.StatusId == 1)
&& oa.UserId == userId
select new
{
ID = o.Id,
Options = Entities.GetOptions(o.Id),
LastUpdated = o.UpdatedDate
}).ToList();
现在,在LinqPad中运行它,不会产生错误,但是如果我在c#项目的函数中运行相同的代码,我会收到以下错误消息。
LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[Dal.GetOptionsReturnModel] GetOptions(System.Nullable`1[System.Int64])' method, and this method cannot be translated into a store expression.
评论这一行:
*Options = Entities.GetOptions(o.Id),*
解决了这个问题,所以我知道这是解决这个问题,但是我无法弄清楚为什么它在LinqPad中有效。
更新
GetOptions是sql server数据库中的一个函数。
更新2
感谢您的回复,我注意到我没有将错误放在这个问题上。有权纠正这一点。
原始错误消息是
LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[Dal.GetOptionsReturnModel] GetOptions(System.Nullable`1[System.Int64])' method, and this method cannot be translated into a store expression.
应用IEnumerable后,错误将更改为:
"System.Data.Entity.Core.EntityCommandExecutionException",
"An error occurred while executing the command definition. See the inner exception for details.",
"There is already an open DataReader associated with this Command which must be closed first.",
" at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)\r\n at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)\r\n
更新3
不确定它是否有帮助,但在Visual Studio中,我使用的是EF 6.0.0
答案 0 :(得分:0)
将AsEnumerable()与Query一起使用
var opps = (from o in Entities.Table1.AsEnumerable()
join oa in Entities.Table2 on o.Id equals oa.Table1Id
where (o.StatusId == 1)
&& oa.UserId == userId
select new
{
ID = o.Id,
Options = Entities.GetOptions(o.Id),
LastUpdated = o.UpdatedDate
}).ToList();
答案 1 :(得分:0)
仍然不确定导致这种情况的原因,但我认为它与升级EF.POCO.Generator插件有关。我创建了一个新的ClassLibrary,当使用加载项的v2.33.0时,一切正常。
问题来自v2.23.0版本的加载项。