我有一个疑问:

int maxShoeSize = Workers
    .Where(x => x.CompanyId == 8)
    .Max(x => x.ShoeSize);

如果公司8根本没有工人,maxShoeSize中会有什么?

更新: 我如何改变查询,以获得0,而不是一个异常?


当前回答

int maxShoeSize=Workers.Where(x=>x.CompanyId==8)
    .Max(x=>(int?)x.ShoeSize).GetValueOrDefault();

(假设ShoeSize是int类型)

如果Workers是来自实体框架的DbSet或ObjectSet,您的初始查询将抛出InvalidOperationException,但不是抱怨一个空序列,而是抱怨物化值NULL不能转换为int。

其他回答

注意:使用DefaultIfEmpty()的查询可能会显著变慢。 在我的情况下,这是一个简单的查询。defaultifempty (DateTime.Now.Date)。

我懒得分析它,但显然EF试图获得所有行,然后取Max()值。

结论:有时处理InvalidOperationException可能是更好的选择。

你可以试试这个:

int maxShoeSize = Workers.Where(x=>x.CompanyId == 8).Max(x => x.ShoeSize) ?? 0;

你可以在.Max()中使用三元来处理谓词并设置它的值;

// assumes Workers != null && Workers.Count() > 0
int maxShoeSize = Workers.Max(x => (x.CompanyId == 8) ? x.ShoeSize : 0);

如果可能的话,您需要处理Workers集合为null/空,但这取决于您的实现。

在这种情况下Max()不会返回任何东西。

它将引发InvalidOperationException异常,因为源不包含任何元素。

int maxShoeSize = Workers.Where(x => x.CompanyId == 8)
                     .Select(x => x.ShoeSize)
                     .DefaultIfEmpty()
                     .Max();