我有一个完美的SQL查询,我需要转换为Linq。我需要将所有记录返回到一个表并将其连接到第二个表。我需要返回第一个表中的所有结果以及第二个表中的结果,其中第二个表中特定字段的值等于变量值(下例中为75)或返回null。
因此,结果中的总行数应该是table1中的总行数。来自table2的连接的行的部分应该显示来自table2的值,其中记录存在值为75或null,其中记录不存在。
编辑:我应该提到t1.field1是一个int而t2.field1是一个可以为空的int。
我尝试了多个linq语句,分组连接,询问同事,谷歌搜索直到我的眼睛流血。我被卡住了。我意识到我的问题措辞可能不明确,如果不是,我会事先道歉。
提前致谢。 克里斯
SQL查询:
SELECT *
FROM table1 AS t1 LEFT OUTER JOIN
table2 AS t2 ON t1.field1 = t2.field1 AND t2.field2 = 75
答案 0 :(得分:0)
使用DefaultIfEmpty
- 有关如何实现此目的的示例,请参阅LINQ - Left Join, Group By, and Count和http://msdn.microsoft.com/en-us/library/bb397895.aspx
答案虽然有效,但并不像我预期的那样优雅:
var q = from item1 in table1
join item2 in table2 on new { Field1=(int?)item1.Field1, Field2=75 }
equals new { item2.Field1, item2.Field2 } into gj
from subItem2 in gj.DefaultIfEmpty()
select new { F1= item1.Field1, F2 = ( subItem2 == null ? string.Empty : subItem2.Field2.ToString()) };
我无法在(Field2 = 75)中看到where子句的位置,因此使用表之间的复合键来实现相同的效果。
丑陋的第二位是对可空int的强制转换,因为复合键中的Field1或它可以等同于表2中的相应字段。
显然你在匿名类型中返回你感兴趣的任何值。注意你不能返回null,这就是为什么我展示了Field2的字符串表示,这样你才能看到从第二个表返回的内容。
答案 1 :(得分:0)
感谢您的回复。因为我需要一些空值,但只有特定id为null的那些空值而不是所有null值,所以上述解决方案都不起作用。如果可能的话,在linq中执行此操作似乎非常困难。
因此,为了节省时间,我决定采用有效的SQL查询并将其转换为存储过程和函数导入。我觉得这可能不是正确的做法,但时间总是一个因素。
再次感谢您的回复。