最好的Linq2Sql相当于IsNull(Max(id))

时间:2009-12-14 20:35:12

标签: .net sql linq-to-sql

我希望将以下SQL转换为Linq2SQL。

select isnull(max(Id),0) from tbl

即使我将Id定义为Int NOT NULL

即使表中没有行,我希望能够得到0的defult值。

我能够提出的最佳可读方法是

var maxId = dc.tbl.Select(row => row.Id)
                  .ToArray().Union(Enumerable.Range(0, 1)).Max();

但是这种方法需要降低所有数据,性能更高但可读性更低

var maxId = dc.tbl.Select(row => row.Id)
                  .OrderByDescending(ii => ii).FirstOrDefault();

有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

我会使用以下内容。

context.Table.Max(row => (Int32?)row.Id) ?? 0

顺便说一下,我认为你的第二个建议比第一个更清楚。

<强>更新

我刚用LINQPad测试了查询。如果LINQPad导致查询在代码中没有工作,那么你的第二个建议可能是最好的解决方案。

context.Table
   .Select(row => row.Id)
   .OrderByDescending(id => id)
   .FirstOrDefault()

缺点是默认值固定为零。可以使用以下查询更改此内容。

context.Table
   .Select(row => (Int32?)row.Id)
   .OrderByDescending(id => id)
   .FirstOrDefault() ?? 0

请注意,以下内容不起作用,因为LINQ to SQL不支持LastOrDefault()

context.Table
   .Select(row => row.Id)
   .OrderBy(id => id)
   .LastOrDefault()

答案 1 :(得分:1)

也许是这样的?

var maxId = dc.tbl.Any() ? dc.tbl.Max(e => e.Id) : 0;

根据this question,你也可以这样做:

var maxId = (from e in dc.tbl
            select (int?)e.Id).Max() ?? 0;

答案 2 :(得分:0)

这样的事情怎么样:

from t in tbl
select new {
  ID = ((System.Int32?)t.ID ?? (System.Int32?)0)
}