我写的这个方法是:
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
行拿出来就没事了,但我真的需要那条线来确保我只有用户区/区域的发票(它们可以属于多个区域)。我的查询有什么根本错误吗?
答案 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;