0

我有我写的这个方法:

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把这条线拿出来很好,但我真的需要这条线来确保我只有来自用户区域的发票(它们可以属于多个区域)。我对这个查询有什么根本错误吗?

4

1 回答 1

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;
于 2012-04-09T20:52:20.027 回答