奇怪的LINQ行为

时间:2014-02-18 13:28:07

标签: c# linq if-statement ternary-operator

我有这段代码:

在这里,我从数据库中获取长篇清单:

IQueryable<long> query = from t in table select t.LongId 

在这里我尝试从这些ID获得最大值:

long max = query.Any() ? query.Max() : 0;

但是无论查询结果有多长,max总是设置为0.

你知道为什么吗?

3 个答案:

答案 0 :(得分:4)

如果

long max = query.Any() ? query.Max() : 0;

返回零,然后下列之一为真:

  1. 查询不会返回任何结果
  2. 查询结果中的最大值为零
  3. 在定义查询和从查询中获取最大值之间修改表时,可能出现第一种情况。请记住 - query没有任何数据。它是唯一的查询定义,只有在执行查询时才会获得数据(例如,调用Any()或Max())。

    测试:

    List<long> table = new List<long> { 1, 2, 3 };
    var query = from t in table select t; // query is not executed
    table.Clear(); // modify data source before query is executed
    Assert.False(query.Any()); // execute query on modified data source
    

答案 1 :(得分:2)

这不会更简单吗?

long max = table.OrderByDescending(t => t.LongId)
                .Select(t => t.LongId)
                .FirstOrDefault() ?? 0;

答案 2 :(得分:1)

最简单的方法:

var maxId = table.OrderByDescending(x => x.LongId).First().LongId;