代码之家  ›  专栏  ›  技术社区  ›  Scott Weinstein

IsNull的最佳Linq2Sql等价物(最大值(id))

  •  4
  • Scott Weinstein  · 技术社区  · 16 年前

    我希望将下面的SQL转换为Linq2SQL。

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

    即使我的Id定义为 Int NOT NULL

    我能想到的最好的可读方法是

    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 回复  |  直到 16 年前
        1
  •  6
  •   Daniel Brückner    16 年前

    我会使用下面这样的东西。

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

    更新

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

    缺点是默认值固定为零。这可以通过以下查询进行更改。

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

    需要注意的是,以下方法不起作用,因为 LastOrDefault() LINQ to SQL不支持。

    context.Table
       .Select(row => row.Id)
       .OrderBy(id => id)
       .LastOrDefault()
    
        2
  •  1
  •   Community Mohan Dere    9 年前

    也许是这样的?

    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;
    
        3
  •  0
  •   C. Ross trotttrotttrott    16 年前

    像这样的怎么样:

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