Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在具有Union的LINQ中的匿名类型中分配可为null的int属性?_C#_.net_Linq - Fatal编程技术网

C# 如何在具有Union的LINQ中的匿名类型中分配可为null的int属性?

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 {

我在LINQ中有两个select语句,它们带有一个
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 with
r=>new
,但在5秒内编辑了它。@tony_Henrich-
RoleID
将在第一个对象中有一个值,但您必须使用
.RoleID.value
。您不能有相同类型的对象列表,但当属性有时可为空时。对于非标准类,您也不能这样做。至于Union和Concat-您通常希望使用
Concat
-这是l在SQL中,ike
union
union all
的比较。