2012-04-09 30 views
0

我有这样的方法我写为:LINQ到实体查询非基本类型

private void GetReceivedInvoiceTasks(User user, List<Task> tasks) 
     { 
      var taskList = from i in _db.Invoices 
          join a in user.Areas on i.AreaId equals a.AreaId 
          where i.Status == InvoiceStatuses.Received 
          select i; 

     } 

基本上我试图让所有用户的区域数据库中具有的接收状态的发票。我现在不了解linq。

我发现了错误:

基{System.SystemException} = {“无法创建类型 'Models.Area' 的恒定值只有原始类型('如的Int32,String和。 Guid')在这方面得到了支持。“}

有人可以向我解释我做错了什么,以及如何解决这个问题?我目前无法了解问题所在。如果我将连接线取出,那很好,但我真的需要这条线来确保我只有用户区域/区域的发票(它们可以属于多个区域)。这个查询是否有根本错误?

回答

4

实体框架不支持与内存中集合的连接。您将不得不重新连线您的查询,以便使用带有原语集合的Contains查询。如果InvoiceStatuses.Received不是enum值忽略此部分)。

两个修复结合起来,导致下面的查询方法这将导致的结果等同于您的加盟:

int statusReceived = (int)InvoiceStatuses.Received; 
var areaIds = user.Areas.Select(x=> x.AreaId).ToArray(); 

var taskList = from i in _db.Invoices 
       where i.Status == statusReceived && areaIds.Contains(i.AreaId) 
       select i;