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

时间:2015-01-31 09:43:10

标签: c# .net linq

我在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;

2 个答案:

答案 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
               }

另见这些问题: