C# 如何在具有Union的LINQ中的匿名类型中分配可为null的int属性?
我在LINQ中有两个select语句,它们带有一个C# 如何在具有Union的LINQ中的匿名类型中分配可为null的int属性?,c#,.net,linq,C#,.net,Linq,我在LINQ中有两个select语句,它们带有一个Union RoleID需要在其中一个选项中有一个空值。我得到下面的错误 如果RoleID有一个值,它工作正常。报告是具有属性的EF实体 在这个例子中,它可以是任何东西。为了便于说明,示例很简单 LinqPad中的代码: var list = Reports.Select(r => new { RoleID = 3 }) .Union(Reports.Select(r => new {
Union
RoleID
需要在其中一个选项中有一个空值。我得到下面的错误
如果RoleID
有一个值,它工作正常。报告是具有属性的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();
var list=Reports。选择(r=>new
{
RoleID=3
})
.Union(报告)选择(r=>new
{
RoleID=new Nullable()您需要RoleID
在第一个匿名类中也可以为null:
Reports.Select(r => new
{
RoleID = (int?)3
}
另见以下问题:
- 如果两个匿名类以相同的顺序使用相同的属性、相同的类型,则它们必须共享相同的类型:
- 您还可以创建匿名类型的列表并添加到其中:
- 此外,您通常希望使用
Concat
,而不是Union
:
您的第一个选择
查询返回匿名对象序列,其中RoleID
具有类型int
。若要合并这两个序列,它们应该具有相同类型的匿名对象。因此,您需要更改第一个查询:
var list = Reports.Select(r => new
{
RoleID = (int?)3
})
请记住,在第二个查询中,您还应该具有可为null的RoleID
,以匹配匿名对象的类型:
.Union(Reports.Select(r => new
{
RoleID = new Nullable<int>()
//RoleID = (int?)null
//RoleID = (int?)4
}));
.Union(Reports.Select(r=>new
{
RoleID=新的可空()
//RoleID=(int?)null
//RoleID=(int?)4
}));
顺便说一句,为什么要在同一来源的两个选择上进行联合?看起来你过度简化了你的示例查询。对下一票有任何评论吗?OP已经指出,RoleID=4
对他们有效……不是我的下一票,但你没有改变答案吗?看起来你原来对union
部分的查询做了更改。我需要RoleID来进行修改一个select中的值。就像在SQL中,您可以为select值指定null,而在另一个union select中,您可以在相同的位置选择实际列。Concat没有任何区别。它给出了相同的错误。@SergeyBerezovskiy-我记不起来了。Meybe I starter withr=>new
,但在5秒内编辑了它。@tony_Henrich-RoleID
将在第一个对象中有一个值,但您必须使用.RoleID.value
。您不能有相同类型的对象列表,但当属性有时可为空时。对于非标准类,您也不能这样做。至于Union和Concat-您通常希望使用Concat
-这是l在SQL中,ikeunion
与union all
的比较。