我在LINQ中有两个select语句Union
.
A 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();
Run Code Online (Sandbox Code Playgroud)
如何使用null值并使RoleID类型为int?
错误信息:
'System.Linq.IQueryable'不包含'Union'的定义,最好的扩展方法重载'System.Linq.ParallelEnumerable.Union(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable)'有一些无效的参数实例参数:无法从'System.Linq.IQueryable'转换为'System.Linq.ParallelQuery'
Ser*_*kiy 13
您的第一个Select
查询返回RoleID
具有类型的匿名对象的序列int
.要合并两个序列,它们应该具有相同类型的匿名对象.所以你需要改变第一个查询:
var list = Reports.Select(r => new
{
RoleID = (int?)3
})
Run Code Online (Sandbox Code Playgroud)
请记住,在第二个查询中,您还应该可以为nullable RoleID
匹配匿名对象的类型:
.Union(Reports.Select(r => new
{
RoleID = new Nullable<int>()
//RoleID = (int?)null
//RoleID = (int?)4
}));
Run Code Online (Sandbox Code Playgroud)
BTW为什么两个选择的联盟来自同一个来源?看起来你简化了样本查询.
您还需要RoleID
在第一个匿名类中可以为空:
Reports.Select(r => new
{
RoleID = (int?)3
}
Run Code Online (Sandbox Code Playgroud)
另见这些问题:
Concat
,而不是Union
:Linq中的Union Vs Concat