使用LINQ将三个列表连接成一个会引发异常

Mik*_*sen 10 .net c# linq entity-framework

好吧,我必须做一些愚蠢的事情,但这不应该起作用吗?我有以下三个清单:

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>
Run Code Online (Sandbox Code Playgroud)

每个列表都有适当的值和计数.我可以返回以下任何一个列表:

return commonViews.ToList();
Run Code Online (Sandbox Code Playgroud)

我可以返回以下任意两个列表:

return commonViews.Concat(ownedViews).ToList();
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试返回所有三个时:

return commonViews.Concat(ownedViews).Concat(sharedViews).ToList();
Run Code Online (Sandbox Code Playgroud)

我得到了例外:

无法创建"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;
Run Code Online (Sandbox Code Playgroud)

看起来像一个可枚举的TPM_VIEWS对象列表,我可以调用ToList()它并获取正确的数据,但它与其他列表不能很好地匹配.

更新2:

这实际上有效.指向可以告诉我原因的人!

commonViews.ToList().Concat(ownedViews.ToList()).Concat(sharedViews.ToList()).ToList();
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 5

问题是Concat()在EF IQueryable<T>上将整个连接转换为单个查询.

当您调用时.Concat(sharedViews),您将传递嵌套实体类的标量(预加载)集合.
EF不知道如何将其转换为查询,所以它抱怨.

您可以通过调用AsEnumerable()而不是更快地加快速度ToList().