使用Linq to Sql按顺序查找孔

时间:2011-10-14 08:49:12

标签: c# linq linq-to-sql

我正在对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。

由于

2 个答案:

答案 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);

打印46,忽略最后一个,因为它始终存在,并且没有简单的方法可以防止在不使用SQL Compact不支持的窗口函数的情况下发生这种情况。 / p>

答案 1 :(得分:0)

  1. 您可以在Linq中进行加入
  2. 由于在我看来您正在尝试解决低级别的数据库完整性问题,我会触发。