为什么FirstOrDefault会遇到此异常? Sequence不包含匹配元素异常

时间:2017-02-09 13:11:26

标签: c# linq

我希望您在更改以下数据类型后可以帮助我编写代码我得到此异常“Sequence包含无匹配元素异常。”。我确信这是因为FirstOrDefault()扩展。

label.Print(printerName);    

这是我的代码:

LandId - long
ShowMapPoint - string
Development - string
Location - string
MapPointX - string
MapPointY - string
AreaSize - from decimal? into long?
Premium - from decimal? into long?
TransactionPrice - from decimal? into long?

2 个答案:

答案 0 :(得分:0)

您的问题是PremiumTransactionPrice

的总和

如果您分组并不包含具有值的项目,那么它将尝试对空值求和。那无能为力。

我会改变如下:

(g.All(p => p.TransactionPrice == null) ? null : g.Where(p => p.TransactionPrice != null).Sum(p => p.TransactionPrice))

(g.All(p => p.ActualSize == null) ? null : g.Where(p => p.ActualSize != null).Sum(p => p.ActualSize)))

首先检查一切是否为空,然后为空,否则对值进行求和。

但是您需要进一步编辑代码,您当前的代码会启用123 / nullnull / 123等情况。这也是一个例外。

答案 1 :(得分:0)

很难理解你在做什么。对于所有这些内联来说,它太复杂了。在第13行你有:

z.TransactionPrice > 0 || z.TransactionPrice != null. 

你也可以删除z.TransactionPrice> 0,因为第二部分允许所有值(非空),包括小于0的所有值。

'序列不包含匹配元素'异常通常是我在使用.First()时所期望的。不是.FirstOrDefault()。

根据您的代码以及我想要实现的目标,我已经重写了查询:

var result = _context.DwPropertyMasters.Where(x => x.ShowMapPoint == "Y")
                .Select(x => new
                {
                    x.LandId,
                    a = x.Development == null || x.Development == "" ? x.Location : x.Development,
                    x.MapPointX,
                    x.MapPointY,
                    AreaSize = x.AreaSize ?? 0,
                    Premium = x.Premium ?? 0,
                    b = (x.AreaSize == 0) ? 0 : (x.Premium * 100000000 / x.AreaSize ?? 0),
                    c = _context.DwPropertyDetails.Where(z => z.TransactionPrice > 0 && z.LandId == x.LandId)
                        .GroupBy(z => z.LandId)
                        .Select(g => g.Sum(p => p.ActualSize) == 0 ? 0 : (g.Sum(p => p.TransactionPrice) / g.Sum(p => p.ActualSize) ?? 0)
                        .FirstOrDefault(),
                    d = (x.AreaSize2 == 0) ? 0 : (x.Premium * 100000000 / x.AreaSize2 ?? 0),
                    x.LandType,
                    e = _context.DwPropertyDetails.Count(y => y.TransactionPrice > 0 && y.LandId == x.LandId)
                });

我不知道这是否按照您的意图行事(并且因为我没有对此进行测试,因此可以正常工作),但它更短,我希望更具可读性。

请记住,此查询是在sql server中执行的,因此无需检查空值。唯一必须防止的是除以零。如果我们考虑下一行:

b = (x.AreaSize == 0) ? 0 : (x.Premium * 100000000 / x.AreaSize ?? 0)

如果:

  • x.AreaSize为null然后(x.Premium * 100000000 / null ?? 0)=>空值 ?? 0 => 0

  • x.AreaSize = 0然后结果= 0.

  • x.Premium为null然后结果为null / value ?? 0 =>空值 ?? 0 => 0

  • x.Premium = 0然后结果= 0.