【问题标题】:multiple linq joins with anonymous types using lambda syntax多个 linq 使用 lambda 语法与匿名类型连接
【发布时间】:2013-10-04 10:00:34
【问题描述】:

我有一个看起来像这样的查询,它可以正常工作:

ColumnA
    .Join(ColumnB, 
        ColumnA => ColumnA.value, 
        ColumnB => ColumnB.value, 
        (ColumnA, ColumnB) =>  new {ColumnA, ColumnB})
    .Join(ColumnC, 
        join1 => join1.ColumnA.value, 
        ColumnC => ColumnC.value, 
        (join1, ColumnC) =>  new {join1, ColumnC})
    .Join(ColumnD, 
        join2 => join2.ColumnC.Value,
        kobling => ColumnD.Value, 
        (join2, jk1Kobling) => new{  ... })     

现在我需要在第二个连接中添加一个额外的列,我尝试了如下所示的内容。到目前为止,我实际上还没有在联接中添加新列,但我打算(代码中的/* new col */)。问题是 Linq 现在显然无法推断类型。为什么会发生这种情况,有没有什么简单的方法可以避免这个问题,而不是仅仅为了加入而创建一个特定的类型?

错误:

The type arguments for method
'System.Linq.Queryable.Join<TOuter,TInner,TKey,TResult>( ...) cannot
be inferred from the usage. Try specifying the type arguments explicitly.

我正在尝试运行的代码:

ColumnA
    .Join(ColumnB, 
        ColumnA => ColumnA.value, 
        ColumnB => ColumnB.value, 
        (ColumnA, ColumnB) =>  new {ColumnA, ColumnB})
    .Join(ColumnC, 
        join1 => new {join1.ColumnA.value,  /* new col */ }, 
        ColumnC => new {ColumnC.value, /* new col*/ }, 
        (join1, ColumnC) =>  new {join1, ColumnC})
    .Join(ColumnD, 
        join2 => join2.ColumnC.Value,
        kobling => ColumnD.Value, 
        (join2, jk1Kobling) => new{  ... })     

更新响应下面评论中的链接:问题与这里的两条中间线有关:

.Join(ColumnC, 
     join1 => new { join1.ColumnA.value }, 
     ColumnC => new { ColumnC.value }, 
     (join1, ColumnC) =>  new {join1, ColumnC})

我现在尝试了以下两件事,结果没有任何变化:

join1 => new { join1.ColumnA.value }, 
         ColumnC => new { value = ColumnC.value }
         join1 => new { value = join1.ColumnA.value }, 
         ColumnC => new { value = ColumnC.value }

我仍然不知道如何指定要比较的内容。任何帮助将不胜感激。

【问题讨论】:

  • 感谢@Dennis 提供的链接,但我不确定它与这种情况的确切关系。查看我的更新 - 我是否忽略了您链接帖子中的某些内容?
  • 最好贴一段真实代码,而不是伪代码。如果ColumnAIEnumerable&lt;T&gt;(或IQueryable&lt;T&gt;),那么ColumnA.value 是什么意思?
  • 我觉得我必须简化代码,因为真正的代码有点凌乱和复杂,我想有人可能会基于此识别出问题所在。也许这太简单了。无论如何,我最终发现了问题(不同的类型,我早该意识到的)。再次感谢您的意见,实际上您的链接确实为我指明了正确的方向。

标签: c# linq join lambda


【解决方案1】:

解决了!如果其他人遇到类似问题:

我的问题是我试图比较的列中的数据类型不同;一个是Short 类型,而另一个是int(也就是说,这些是用于表示表的C# 实体类中的类型)。在这种情况下,Linq 在比较时无法决定使用哪种类型。

解决方案:将short 值转换为int

join1 => new { value = (int) join1.ColumnA.value }, 
ColumnC => new { value = ColumnC.value }

添加新列后,解决方案如下所示:

join1 => new {
               value = (int) join1.ColumnA.value, 
               otherValue =  join1.other
             }, 
ColumnC => new { 
                value = ColumnC.value, 
                otherValue = ColumnC.other
               }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多