Linq to Entities查询非原始类型

时间:2012-04-09 20:46:00

标签: linq entity-framework linq-to-entities

我写的这个方法是:

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。

我收到了错误:

  

base {System.SystemException} = {“无法创建常量值   输入'Models.Area'。只有原始类型('如Int32,String和   在这种情况下支持Guid'。“}

有人可以向我解释我做错了什么以及如何解决这个问题?我目前无法理解问题所在。如果我把join行拿出来就没事了,但我真的需要那条线来确保我只有用户区/区域的发票(它们可以属于多个区域)。我的查询有什么根本错误吗?

1 个答案:

答案 0 :(得分:4)

实体框架不支持与内存中集合的连接。您必须重新连接查询,以便使用带有基元集合的Contains查询。

此外,EF目前不支持枚举值,因此您必须与整数值进行比较(如果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;