【问题标题】:How to assign a nullable int property in an anonymous type in LINQ with a Union?如何在带有联合的 LINQ 中以匿名类型分配可为空的 int 属性?
【发布时间】:2015-01-31 09:43:09
【问题描述】:

我在 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 类型?

错误信息:

“System.Linq.IQueryable”不包含“Union”的定义,并且最佳扩展方法重载“System.Linq.ParallelEnumerable.Union(System.Linq.ParallelQuery, System.Collections.Generic.IEnumerable)”具有一些无效的论点 实例参数:无法从“System.Linq.IQueryable”转换为“System.Linq.ParallelQuery”

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    您的第一个Select 查询返回匿名对象序列,其中RoleID 的类型为int。要合并两个序列,它们应该具有相同类型的匿名对象。所以你需要改变第一个查询:

    var list = Reports.Select(r => new
                    {
                        RoleID = (int?)3
                    })
    

    请记住,在第二个查询中,您还应该有可空的 RoleID 以匹配匿名对象的类型:

     .Union(Reports.Select(r => new
        {
            RoleID = new Nullable<int>() 
            //RoleID = (int?)null
            //RoleID = (int?)4
        }));
    

    顺便说一句,为什么要对来自同一来源的两个选择进行联合?看起来您过度简化了示例查询。

    【讨论】:

      【解决方案2】:

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

      Reports.Select(r => new
                     {
                         RoleID = (int?)3
                     }
      

      另请参阅以下问题:

      【讨论】:

      • 对否决票有何评论? OP 表示 RoleID = 4 为他们工作......
      • 不是我的反对意见,但你没有改变答案吗?好像您最初对查询的 Union 部分进行了更改
      • 我需要 RoleID 在其中一个选择中有一个值。就像在 SQL 中,您可以将空值分配给选择值,而在另一个联合选择中,您可以在同一位置选择实际列。 Concat 没有任何区别。它给出了同样的错误。
      • @SergeyBerezovskiy - 我不记得了。 Meybe 我从 r =&gt; new 开始,但在 5 秒内编辑了它。
      • @Tony_Henrich - RoleID 将在第一个对象中有一个值,但您必须使用 .RoleID.Value。您不能拥有相同类型的对象列表,但是当属性有时可以为空时。你也不能用普通类来做到这一点。至于 Union 和 Concat - 您通常希望使用 Concat - 这就像 SQL 中的 union 与 union all。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      相关资源
      最近更新 更多