如何正确地重写这个linq查询?

时间:2011-09-20 15:27:29

标签: c# linq compiler-errors rewrite

int id =2 ;
(from t1 in Table1
 join t2 in Table2
 on new { t1.id, id} equals new { t2.id, t2.otherid }
 select t1).ToList();

目前上面的查询给出了编译错误

  

其中一个连接表达式的类型不正确。

正如您在上面的查询中所看到的,我想像在sql中一样加入一个整数值。我想要这些,以便查询更快,我不想在最后做一个地方,因为这意味着它将获得所有行,然后使用where子句进行过滤。因为我在两个表中都有很多行,所以如果我可以在join子句本身上过滤行会很好。谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

您需要在联接的两半中使用相同的匿名类型(具有相同的属性名称):

on new { t1.id, otherId = 2 } equals new { t2.id, t2.otherId }

您的文字暗示您实际上想要加入单个值;如果是这样,您根本不需要匿名类型:

on t1.id equals t2.otherid

答案 1 :(得分:4)

使用匿名类加入时,这些类名称的成员必须匹配。通过向匿名类的成员添加名称可以轻松解决问题:

int id = 2;

(from t1 in Table1
 join t2 in Table2
 on new { Id = t1.id, OtherId = id } 
     equals new { Id = t2.id, OtherId = t2.otherid }
 select t1).ToList();

虽然,我看的越多,我就越意识到连接不需要那么复杂。看起来你在连接中添加静态id。您应该能够在where子句中使用它,这会将连接减少为单个值:

int id = 2;

(from t1 in Table1
 from t2 in Table2
 on t1.id equals t2.id
 where t2.otherid = id
 select t1).ToList();

答案 2 :(得分:0)

我看到两种可能的解决方案:

此变体预过滤Table2,然后执行连接。

    int id =2;
    (from t1 in Table1
    join t2 in (from a in Table2 where a.otherid == id select a)
    on t1.id equals t2.id
    select t1).ToList(); 

以下是原始代码的调试版本。因为编译器在创建匿名对象时使用属性名称,所以必须明确名称。

    int id =2;
    (from t1 in Table1
    join t2 in Table2
    on new { Id1 = t1.id, Id2 = id } equals new { Id1 = t2.id, Id2 = t2.otherid }
    select t1).ToList(); 

HTH,马克