好的,我可能做了一些愚蠢的事情,但这不应该有效吗?我有以下三个列表:
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();
我收到了这个异常:
无法创建类型为'Entity.TPM_VIEWS'的常数值。在此上下文中,仅支持基元类型或枚举类型。
我做错了什么?这三个值都是可以枚举的。主要是因为我问这个问题是最好的办法来确保我发布后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();
.ToList()
(从而使查询材料化),我就可以聚合。这不是一个坏的解决方案,但它仍然让我有点困惑。这一定是Entity Framework正在尝试一次性材料化整个表达树所做的一些奇怪的事情。 - Mike ChristensenToList();
不是将 IQueryable 转换为 IEnumerable,以便进行 concat 操作吗? - Lotok.AsEnumerable()
代替.ToList()
,这将强制使用简单的LINQ操作符,而不是生成大量的EF IQueryable。应该具有与.ToList()
相同的效果,但在内存使用方面要更高效。 - Cory Nelson