LinqPad查询运行正常,但在Visual Studio

时间:2017-11-02 15:47:26

标签: c# entity-framework linq linq-to-sql linqpad

我在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

2 个答案:

答案 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版本的加载项。