好吧,我一定是在做一些愚蠢的事情,但这不应该起作用吗?我有以下三个列表:
var commonViews = (from v in context.TPM_VIEWS where v.VIEWID < 0 select v); // IQueryable<TPM_VIEWS>
var ownedViews = (from v in context.TPM_VIEWS where v.OWNERID == userId && v.VIEWID > 0 select v); // IQueryable<TPM_VIEWS>
var sharedViews = (from v in context.TPM_USER.Include("TPM_VIEWS2") where v.USERID == userId select v).First().TPM_VIEWS2; // EntityCollection<TPM_VIEWS>
每个列表都有正确的值和计数。我可以返回这些列表中的任何一个:
return commonViews.ToList();
我可以返回这些列表中的任意两个:
return commonViews.Concat(ownedViews).ToList();
但是,当我尝试返回全部三个时:
return commonViews.Concat(ownedViews).Concat(sharedViews).ToList();
我得到异常:
Unable to create a constant value of type 'Entity.TPM_VIEWS'. Only primitive types or enumeration types are supported in this context.
我做错了什么?这三个值确实是可枚举的。大多数情况下,我问这个问题是因为这是保证我会在发布 30 秒后注意到问题的最佳方式。
更新:
我 93% 确定问题出在这里:
var sharedViews = (from v in context.TPM_USER.Include("TPM_VIEWS2") where v.USERID == userId select v).First().TPM_VIEWS2;
这看起来像TPM_VIEWS
对象的可枚举列表,我可以对其调用ToList()
并获得正确的数据,但是它不能很好地与其他列表一起使用。
更新 2:
这确实有效。指出可以告诉我原因的人!
commonViews.ToList().Concat(ownedViews.ToList()).Concat(sharedViews.ToList()).ToList();
最佳答案
问题是 Concat()
在 EF 上 IQueryable<T>
会将整个连接变成一个查询。
当您调用 .Concat(sharedViews)
时,您正在传递嵌套实体类的标量(预加载)集合。
EF 不知道如何将其转换为查询,因此它会提示。
您可以通过调用 AsEnumerable()
使其更快而不是 ToList()
.
关于c# - 使用 LINQ 将三个列表连接成一个会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17734572/