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 to Sql按顺序查找孔_C#_Linq_Linq To Sql - Fatal编程技术网

C# 使用Linq to 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的东西来实现同样的目标。因为每次插入都会调

我正在对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的东西来实现同样的目标。因为每次插入都会调用它,所以我需要它快速且更优雅:-D

谢谢

  • 你可以在Linq中进行连接
  • 因为在我看来,您正试图解决一个低级别的db完整性问题,所以我建议您触发

  • 在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中不可能使用触发器。