如何在LINQ中使用Union分配匿名类型中的可空int属性?

Ton*_*ich 8 .net c# linq

我在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为什么两个选择的联盟来自同一个来源?看起来你简化了样本查询.


Kob*_*obi 6

您还需要RoleID在第一个匿名类中可以为空:

Reports.Select(r => new
               {
                   RoleID = (int?)3
               }
Run Code Online (Sandbox Code Playgroud)

另见这些问题: