C# Linq中带非等号谓词的外连接的等价性
我正在寻找与以下SQL等效的Linq:C# Linq中带非等号谓词的外连接的等价性,c#,linq,join,linq-to-sql,outer-join,C#,Linq,Join,Linq To Sql,Outer Join,我正在寻找与以下SQL等效的Linq: SELECT t0.Fk_CompanyId, t0.CheckedUtc, t0.IsBlocking FROM MyTable t0 LEFT OUTER JOIN MyTable t1 ON t0.Fk_CompanyId = t1.Fk_CompanyId AND t0.CheckedUtc < t1.CheckedUtc WHERE t1.Fk_CompanyId IS NULL AND t0.CheckedUtc
SELECT t0.Fk_CompanyId, t0.CheckedUtc, t0.IsBlocking
FROM MyTable t0
LEFT OUTER JOIN MyTable t1
ON t0.Fk_CompanyId = t1.Fk_CompanyId AND t0.CheckedUtc < t1.CheckedUtc
WHERE t1.Fk_CompanyId IS NULL
AND t0.CheckedUtc IS NOT NULL
选择t0.Fk_CompanyId、t0.CheckedUtc、t0.IsBlocking
从MyTable t0
左外联接表t1
关于t0.Fk_CompanyId=t1.Fk_CompanyId和t0.CheckedUtc
我与Linq最接近的是:
from t0 in MyTable
join t1 in MyTable on t0.Fk_CompanyId equals t1.Fk_CompanyId into t1tmp
from t1 in t1tmp.DefaultIfEmpty()
where t1.Fk_CompanyId == null && t0.CheckedUtc != null && t0.CheckedUtc < t1.CheckedUtc
select new { cid = t0.Fk_CompanyId, cuct = t0.CheckedUtc, isbl = t0.IsBlocking }
MyTable中t0的
将t0.Fk_CompanyId等于t1.Fk_CompanyId的MyTable中的t1连接到t1tmp中
从t1tmp.DefaultIfEmpty()中的t1开始
其中t1.Fk_CompanyId==null&&t0.CheckedUtc!=null&&t0.CheckedUtc
。。。这将生成以下SQL(稍微重新格式化):
选择t0.Fk_CompanyId、t0.CheckedUtc、t0.IsBlocking
从MyTable作为t0
左外连接MyTable为t1
关于t0.Fk_CompanyId=t1.Fk_CompanyId
其中(t1.Fk_CompanyId为空)
和(t0.CheckedUtc不为空)
和(t0.CheckedUtc
这些并不完全相同。(当我在t0.CheckedUtc
上进行左外连接时,t0.CheckedUtc
在连接的右侧生成空值。当我使用WHERE
进行过滤时,这会删除我感兴趣的所有空值
透视图:我正在尝试查找MyTable中包含最新CheckedUtc的行,如果有任何非空行,则按Fk_CompanyId分组。我希望每个Fk_公司一行。有几个“可能的重复项”只处理查找最近的CheckedUtc(但不是它们各自的行),或者假设CheckedUtc不为NULL
因此:如何在Linq中对非等号谓词执行等效的连接?试试这个
from t0 in MyTable
From t1 in MyTable( x=>x.Fk_CompanyId=t0.Fk_CompanyId && x.CheckedUtc > t0.CheckedUtc ).DefaultIfEmpty()
where t1.Fk_CompanyId == null && t0.CheckedUtc != null
select new { cid = t0.Fk_CompanyId, cuct = t0.CheckedUtc, isbl = t0.IsBlocking }
谢谢你,@MukeshKalgude!!!所以诀窍是把连接条件放在被连接表的
.Where()
子句中。我不明白你说什么对不起,没关系。林帕德在捉弄我。我将删除我的评论。
from t0 in MyTable
From t1 in MyTable( x=>x.Fk_CompanyId=t0.Fk_CompanyId && x.CheckedUtc > t0.CheckedUtc ).DefaultIfEmpty()
where t1.Fk_CompanyId == null && t0.CheckedUtc != null
select new { cid = t0.Fk_CompanyId, cuct = t0.CheckedUtc, isbl = t0.IsBlocking }