如何正确地重写这个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子句过滤。因为我有很多行在这两个表,这将是很好的,如果我可以过滤行上的连接子句本身。谢谢您的帮助!

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

您需要在连接的两个部分使用相同的匿名类型(具有相同的属性名):

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,马克