我希望将以下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();
有更好的方法吗?
答案 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)
}