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子句本身上过滤行会很好。谢谢你的帮助!
答案 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,马克