加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:46:42 所属栏目:百科 来源:网络整理
导读:好的,我一定要做点蠢事,但这不行吗?我有以下三个列表: var commonViews = (from v in context.TPM_VIEWS where v.VIEWID 0 select v); // IQueryableTPM_VIEWSvar ownedViews = (from v in context.TPM_VIEWS where v.OWNERID == userId v.VIEWID 0 select
好的,我一定要做点蠢事,但这不行吗?我有以下三个列表:
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()来更快地实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读