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

标签 c# .net 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>

每个列表都有正确的值和计数。我可以返回这些列表中的任何一个:

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();

最佳答案

问题是 Concat()在 EF 上 IQueryable<T>会将整个连接变成一个查询。

当您调用 .Concat(sharedViews) 时,您正在传递嵌套实体类的标量(预加载)集合。
EF 不知道如何将其转换为查询,因此它会提示。

您可以通过调用 AsEnumerable() 使其更快而不是 ToList() .

关于c# - 使用 LINQ 将三个列表连接成一个会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17734572/

相关文章:

c# - 避免 PropertyGrid 的异常

c# - 转换数组并执行 contains

c# - LINQ 作为方法参数

c# - 这可以通过使用 linq 使其更具可读性吗?

c# - SQL Server 用户实例错误 : Existing databases has reached the max number allowed

javascript - Microsoft Dynamics 365 CRM WebAPI 弃用替换

c# - 为什么连接空字符串有效但调用 "null.ToString()"无效?

c# - 2D WPF 游戏,我有哪些选择?

c# - requiredif Entity Framework 空字段

c# - 使用属性读取 XML 的最简单方法