我在LINQ中有两个带有Union
的select语句。
RoleID
需要在其中一个选项中包含空值。我收到以下错误。
如果RoleID
有值,则可以正常工作。 Reports是具有属性的EF实体。
在这个例子中它可以是任何东西。示例很简单,用于说明目的。
LinqPad中的代码:
var list = Reports.Select(r => new
{
RoleID = 3
})
.Union(Reports.Select(r => new
{
RoleID = new Nullable<int>() <= error
//RoleID = (int?) null <= error
//RoleID = 4 <= works
}));
list.Dump();
如何使用null值并使RoleID类型为int?
错误消息:
&#39; System.Linq.IQueryable&#39;不包含&#39; Union&#39;的定义和最好的扩展方法重载&#39; System.Linq.ParallelEnumerable.Union(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable)&#39;有一些无效的论点 实例参数:无法转换为System.Linq.IQueryable&#39;到了System.Linq.ParallelQuery&#39;
答案 0 :(得分:13)
您的第一个Select
查询返回RoleID
类型为int
的匿名对象序列。要合并两个序列,它们应该具有相同类型的匿名对象。所以你需要改变第一个查询:
var list = Reports.Select(r => new
{
RoleID = (int?)3
})
请注意,在第二个查询中,您还应该可以使用nullable RoleID
来匹配匿名对象的类型:
.Union(Reports.Select(r => new
{
RoleID = new Nullable<int>()
//RoleID = (int?)null
//RoleID = (int?)4
}));
顺便说一句为什么两个联盟选择来自同一个来源?看起来你简化了样本查询。
答案 1 :(得分:6)
您还需要RoleID
在第一个匿名类中可以为空:
Reports.Select(r => new
{
RoleID = (int?)3
}
另见这些问题:
Concat
,而不是Union
:Union Vs Concat in Linq