1

我有下面的代码(这实际上是一个更复杂的查询的一部分,但我已将问题隔离到这一特定行以帮助调试)根据我读过的所有内容应该在 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 文件中都找不到参考。

4

1 回答 1

1

包含不会转换为有效的 SQL,因为评估 ID 不是 IQueryable,它是内存中的对象。因此,您必须先提取数据,然后再进行检查。

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

var result = assessments.Intersect(assessmentIDs);
于 2012-07-31T16:40:21.820 回答