我正在对SQL Server Compact数据库使用Linq to Sql。 我需要一种快速的方法来找到基于整数的列中的第一个洞,或者如果不存在最高的数字+ 1。
如果我使用SQL来做,我会做这样的事情:
SELECT IdLegacy+1 FROM FLUID AS t1
LEFT JOIN FLUID as t2
ON t1.IdLegacy = t2.IdLegacy+1
WHERE t2.IdLegacy IS NULL
基本上我需要在Linq到Sql中使用类似的东西来实现同样的功能。因为它会在每个插页上调用,所以我需要它快速且优选的优雅:-D。
由于
答案 0 :(得分:1)
左外连接在LINQ to SQL
中看起来像这样from t1 in fluid
join t2 in fluid on t1.LegacyId + 1 equals t2.LegacyId into t3
from maybeGap in t3.DefaultIfEmpty()
where maybeGap == null
select new { t1 = t1 }
maybeGap
现在反映的是来自流量的left outer join
的记录。可能是SQL Compact的LINQ提供程序受限制,因为SQL Compact非常有限,但这是它的基本要点。
您可以使用这个小测试用例进行测试:
var list = new List<int> { 1, 2, 3, 5 };
var q =
from x in list
join y in list on x + 1 equals y into y
from z in y.DefaultIfEmpty()
where z == 0
select x + 1
;
foreach (var item in q)
Console.WriteLine(item);
打印4
和6
,忽略最后一个,因为它始终存在,并且没有简单的方法可以防止在不使用SQL Compact不支持的窗口函数的情况下发生这种情况。 / p>
答案 1 :(得分:0)