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(); 我得到例外:
我究竟做错了什么?所有这三个值都是无可否认的.大多数情况下,我提出这个问题,因为这是最好的方法,以确保我在发布后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)时,你传递一个你的嵌套实体类的标量(预加载)集合. 您可以通过调用AsEnumerable()而不是ToList()来更快地实现. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |