我有一个疑问:

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

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

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


当前回答

Max会抛出System。序列不包含元素

class Program
{
    static void Main(string[] args)
    {
        List<MyClass> list = new List<MyClass>();

        list.Add(new MyClass() { Value = 2 });

        IEnumerable<MyClass> iterator = list.Where(x => x.Value == 3); // empty iterator.

        int max = iterator.Max(x => x.Value); // throws System.InvalidOperationException
    }
}

class MyClass
{
    public int Value;
}

其他回答

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

DefaultIfEmpty中的0是不必要的。

你可以试试这个:

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

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

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

Max会抛出System。序列不包含元素

class Program
{
    static void Main(string[] args)
    {
        List<MyClass> list = new List<MyClass>();

        list.Add(new MyClass() { Value = 2 });

        IEnumerable<MyClass> iterator = list.Where(x => x.Value == 3); // empty iterator.

        int max = iterator.Max(x => x.Value); // throws System.InvalidOperationException
    }
}

class MyClass
{
    public int Value;
}
int maxShoeSize=Workers.Where(x=>x.CompanyId==8)
    .Max(x=>(int?)x.ShoeSize).GetValueOrDefault();

(假设ShoeSize是int类型)

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