我有一个看起来像这样的查询,它可以正常工作:
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 }
我仍然无法弄清楚如何指定要比较的内容。任何帮助将不胜感激。
答案 0 :(得分:3)
解决!如果其他人遇到类似的问题:
我的问题是我试图比较的列中的数据类型是不同的;一个是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
}