Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq中带非等号谓词的外连接的等价性_C#_Linq_Join_Linq To Sql_Outer Join - Fatal编程技术网

C# 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

我正在寻找与以下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 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 }