c# – 将三个列表与LINQ连接成一个异常

前端之家收集整理的这篇文章主要介绍了c# – 将三个列表与LINQ连接成一个异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,我一定要做点蠢事,但这不行吗?我有以下三个列表:
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();

解决方法

问题在于EF IQueryable< T>上的Concat()将整个连接变成单个查询.

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

您可以通过调用AsEnumerable()而不是ToList()来更快地实现.

猜你在找的C#相关文章