两个表在lambda表达式中具有多个连接条件

时间:2014-04-10 09:55:30

标签: .net linq lambda expression

我想加入两张桌子。两个表的连接列为column3,column4。

Visual Studio抛出以下错误:

  

方法的类型参数

     

' System.Linq.Enumerable.Join   (System.Collections.Generic.IEnumerable,   System.Collections.Generic.IEnumerable,System.Func,   System.Func,System.Func)'

     

无法从使用中推断出来。尝试明确指定类型参数。

我的代码如下:

int i = context.Table1.Where(u => u.column1 == true).Join(
    context.Table2.Where(u => u.column2.ToUpper() == "COMPLETED"),
    q => new { Column3 = q.column3, Column4 = q.column4 },
    u => new { Column3 = u.column3, Column4 = u.column4 },
    (q, u) => new { q.column1 }).Count();

此查询有什么问题?

提前致谢。

2 个答案:

答案 0 :(得分:2)

查询本身似乎很好,但我们不知道context.TableX的完整类型。

对于Join to compile,new { Column3 = q.column3, Column4 = q.column4 }部分定义的两个匿名类型都需要具有相同的属性类型,因此生成的匿名类型是相同的。 Table1Table2的条目是否具有相同的类型,或者它们的列类型不匹配?

在我的机器上,

l1.Join(l2, 
        d => new { P = d.Column1, Q = d.Column2 }, 
        d => new { P = d.Column1, Q = d.Column2 }, 
        (d, u) => new { d.Column1 }).Count();

编译正常,l1l2类型List<Dummy>Dummy只有两个整数属性。

答案 1 :(得分:1)

我已经遇到过几次了,解决方法是将每一列都强制转换为正确的类型:

int i = context.Table1.Where(u => u.column1 == true).Join(
context.Table2.Where(u => u.column2.ToUpper() == "COMPLETED"),
q => new { Column3 = (string)q.column3, Column4 = (decimal?)q.column4 },
u => new { Column3 = (string)u.column3, Column4 = (decimal?)u.column4 },
(q, u) => new { q.column1 }).Count();
相关问题