c# - 使用 Linq to Sql 在序列中查找漏洞

标签 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 to Sql 中使用类似的东西来实现相同的目的。因为它会在每次插入时被调用,所以我需要它快速且优雅 :-D。

谢谢

最佳答案

左外连接在 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 现在反射(reflect)了来自 fluid 的 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 支持。

关于c# - 使用 Linq to Sql 在序列中查找漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765181/

相关文章:

c# - 从 Windows 窗体应用程序 C# 控制控制台应用程序

c# - Azure sql 数据库相关异常

c# - 如何使用 group by 数据创建 Left Join

c# - 使用 LINQ 选择一行中的多个元素

linq-to-sql - 如何通过 LINQ to SQL 在存储过程中使用临时表

c# - 如何正确关闭保存文件句柄

c# - System.ComponentModel.TypeConverter 的 WinRT 替换

c# - 使用 LINQ 计算集合中的单词

linq-to-sql - 在 Linq to SQL 中执行条件批量更新

database - 试图删除 (*) 和 (*) 之间的关系。但是,关系的外键之一 (X) 不能设置为 null