2011-06-01 144 views
1
var depts = ctx.Departments 
      .OrderBy(d => d.deptName) 
      .Select(d => d.deptNo); 

foreach (int deptNumber in depts) { 
    var deptReports = from d in ctx.Departments 
         join r in matchingIncidents on d.deptNo equals r.deptNo 
         where r.deptNo == deptNumber 
         select r; 

    int deptReportsCount = deptReports.Count(); 

我完全感到困惑!所有关于这个错误的问题都说在我正在做的原始字段(比如ID)上使用==。我对这个查询做的任何事情都会产生异常。完全相同的代码之前工作,我不知道我已经做了什么!有人可以向我解释发生了什么事吗?实体框架 - NotSupportedException

另外,我记得有一个EntityFramework类的方法允许您在查询内转换对象(例如日期),有人知道这个类是什么吗?

更新:

以下是我所做的更改(现在的作用)。

var deptReports = from r in matchingIncidents 
        join d in ctx.Departments on r.deptNo equals d.deptNo 
        where r.deptNo == deptNumber 
        select r; 
+0

是'matchingIncidents'的'IQueryable'或已经加载到内存中的对象的列表?如果它是内存中的集合,请记住,UPDATE代码中的“join”不会发生在数据库中,而是发生在内存中 - 这意味着:在执行联接之前,整个“Departments”表将被加载到内存中记忆。 – Slauma 2011-06-01 18:11:47

回答

2

matchingIncidents看起来像一个复杂类型的本地集合(因为你使用r.deptNo)。这在LINQ to Entities中是不允许的。你可以代替试试这个:

foreach (int deptNumber in depts) { 
    var deptReports = from d in ctx.Departments 
         join r in matchingIncidents.Select(m => m.deptNo) 
          on d.deptNo equals r 
         where r == deptNumber 
         select r; 

int deptReportsCount = deptReports.Count(); 

matchingIncidents.Select(m => m.deptNo)现在是原始类型的本地收集和deptReportsint(假设deptNoint型)的序列。但为了计算结果元素,它应该还是很好的。

编辑

而且你可能搜索的静态EntityFunctions类:

http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx

+0

谢谢!这就是我改变(试图重构/优化我的代码)。而且你也对EntityFunctions类感到震惊!你是我的英雄:) – Lifes 2011-06-01 16:44:01

+0

对于这个问题上的任何人,matchingIncidents是来自先前查询的事件对象的列表。 – Lifes 2011-06-01 16:54:06

0

可能的问题是:

join r in matchingIncidents on d.deptNo == r.deptNo 
+0

这是连接语法的一部分。拿出来会导致语法错误。 – Lifes 2011-06-01 16:26:33