【问题标题】:LINQ to Entities (.NET 4.0)LINQ 到实体 (.NET 4.0)
【发布时间】:2012-07-31 16:32:34
【问题描述】:

我有下面的代码(这实际上是一个更复杂的查询的一部分,但我已将问题隔离到这一特定行以帮助调试)根据我读过的所有内容应该在 SQL 中创建一个 IN 子句,假设我正在使用 EF4。据我所知,我正在使用 EF4(我们的项目使用 .NET Framework 4,当我查看 System.Data 和 System.Data.Entity 时,他们都说所有项目的版本都是 4.0.0.0)

int[] assessmentIDs; // this is just here to show what this is, 
                     // but it is a params parameter passed to this methed                  

var assessments = from cert in container.ProctorAssessmentCertifications
                  where assessmentIDs.Contains(cert.AssessmentID)
                  select cert.ID;

但是,当我运行它时,我得到了运行时错误:

LINQ to Entities does not recognize the method 'Boolean Contains[Int32](Int32[], Int32)' method, and this method cannot be translated into a store expression.

当我使用 LinqPad 时,它会正确输出一个 IN 子句,就像在 EF4 中所期望的那样。 我的问题是:

A.我做错了什么,我该如何做?

B.如果实际上不是,我如何强制调用 EF4?我在任何指向旧版本的 web.config 文件中都找不到参考。

【问题讨论】:

    标签: entity-framework c#-4.0 entity-framework-4 linq-to-entities


    【解决方案1】:

    Contains 不会被转换为有效的 SQL,因为assessmentIDs 不是 IQueryable,它是一个内存对象。所以你必须先把数据拉出来,然后再做检查。

    var assessments = (from cert in container.ProctorAssessmentCertifications                  
                      select cert.ID).ToList() //no longer IQueryable.
    
    var result = assessments.Intersect(assessmentIDs);
    

    【讨论】:

    • 这不是 OP 想要的,因为它会从服务器检索所有数据。出于明显的性能考虑,OP 希望 SQL Server 完成“相交”。
    • @ken2k 如果这只是一个查找表并且对性能的影响很小怎么办?你为什么不发布解决方案?
    • 这在逻辑上会有点慢。我通过相反的方式解决了它: IQueryable ids =assessmentIDs.AsQueryable();然后在上述查询中使用 ids 而不是assessmentIDs。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2011-06-15
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多