如何正确地重写这个linq查询
本文关键字:linq 查询 重写 正确地 | 更新日期: 2023-09-27 18:09:03
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,因为那意味着它会得到所有的行,然后用where子句过滤。因为我有很多行在这两个表,这将是很好的,如果我可以过滤行上的连接子句本身。谢谢您的帮助!
您需要在连接的两个部分使用相同的匿名类型(具有相同的属性名):
on new { t1.id, otherId = 2 } equals new { t2.id, t2.otherId }
你的文本暗示你实际上想要连接一个值;如果是这样,您根本不需要匿名类型:
on t1.id equals t2.otherid
使用匿名类加入时,这些类名的成员必须匹配。这个问题很容易通过给匿名类的成员添加名字来解决:
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,然后执行连接。
int id =2;(表1中的t1(从表2中a.otherid == id select a)在t1。Id等于t2选择t1) .ToList ();之前这是原始代码的一个经过调试的变体。因为编译器在创建匿名对象时会使用属性名,所以你必须明确这些名称。
int id =2;(表1中的t1连接表2中的t2on new {Id1 = t1。id, Id2 = id} = new {Id1 = t2}id, Id2 = t2otherid}选择t1) .ToList ();之前HTH,马克