C# 使用Linq to Sql按顺序查找孔
我正在对SQLServer Compact数据库使用LINQtoSQL。 我需要一种快速的方法来查找基于整数的列中的第一个孔,或者如果不存在,则查找最大数+1 如果我使用SQL,我会这样做:C# 使用Linq to Sql按顺序查找孔,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我正在对SQLServer Compact数据库使用LINQtoSQL。 我需要一种快速的方法来查找基于整数的列中的第一个孔,或者如果不存在,则查找最大数+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的东西来实现同样的目标。因为每次插入都会调
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
谢谢
在LINQ到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
现在反映的记录是流体中的左外连接。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);
var list=新列表{1,2,3,5};
变量q=
从列表中的x开始
将y加入x+1上的列表等于y加入y
从y中的z开始。DefaultIfEmpty()
其中z==0
选择x+1
;
foreach(q中的var项目)
控制台写入线(项目);
打印4
和6
,只需忽略最后一个,因为它将始终存在,如果不使用SQL Compact不支持的窗口函数,就没有简单的方法来防止这种情况发生。但是解决方案p已经不快了-linq如何能更好?我没有说linq应该提供更好的解决方案,只是我想要一个类似的。所显示的SQL具有可接受的性能,任何建议的解决方案都应至少具有相同的性能。诚然,客户坚持为旧记录和新记录保留旧id列。在SQL CE中不可能使用触发器。