我有一个疑问:
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 => x.ShoeSize);
如果公司8根本没有工人,maxShoeSize中会有什么?
更新: 我如何改变查询,以获得0,而不是一个异常?
当前回答
你可以在.Max()中使用三元来处理谓词并设置它的值;
// assumes Workers != null && Workers.Count() > 0
int maxShoeSize = Workers.Max(x => (x.CompanyId == 8) ? x.ShoeSize : 0);
如果可能的话,您需要处理Workers集合为null/空,但这取决于您的实现。
其他回答
注意:使用DefaultIfEmpty()的查询可能会显著变慢。 在我的情况下,这是一个简单的查询。defaultifempty (DateTime.Now.Date)。
我懒得分析它,但显然EF试图获得所有行,然后取Max()值。
结论:有时处理InvalidOperationException可能是更好的选择。
在这种情况下Max()不会返回任何东西。
它将引发InvalidOperationException异常,因为源不包含任何元素。
如果这是Linq到SQL,我不喜欢使用Any(),因为它会导致对SQL服务器的多次查询。
如果ShoeSize不是一个可空字段,那么使用.Max(..) ??0不能工作,但下面的可以:
int maxShoeSize = Workers.Where(x = >x.CompanyId == 8).Max(x => (int?)x.ShoeSize) ?? 0;
它绝对不会改变发出的SQL,但如果序列为空,它会返回0,因为它改变了Max()以返回int?而不是int型。
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;
}
您可以在执行Max()之前检查是否有任何工作人员。
private int FindMaxShoeSize(IList<MyClass> workers) {
var workersInCompany = workers.Where(x => x.CompanyId == 8);
if(!workersInCompany.Any()) { return 0; }
return workersInCompany.Max(x => x.ShoeSize);
}