Svi*_*ish 18 c# nullreferenceexception linq-to-sql
我有这个代码(好吧,我没有,但类似的东西:p)
var dogs = Dogs.Select(ø => new Row
{
Name = ø.Name,
WeightOfNiceCats = ø.Owner
.Cats
.Where(æ => !æ.Annoying)
.Sum(æ => æ.Weight),
});
Run Code Online (Sandbox Code Playgroud)
在这里,我通过所有的狗,并总结所有不讨厌的猫的重量(进入一个不可空的小数),与猫拥有相同的所有者.当然,几乎所有的猫都很烦,所以我得到这个错误:
无法将null值分配给类型为System.Decimal的成员,该成员是非可空值类型.
使用的字段或外键都不能为空.因此,当Where子句没有返回猫时会发生错误,而这通常会发生.但是我该如何解决这个问题呢?当发生这种情况时,我希望它返回0.试过DefaultIfEmpty()后面的Where条款,但后来我得到这个错误:
你调用的对象是空的.
我猜这是可以理解的.我试图添加一个??后Sum,但由于这个错误它不会编译:
接线员'??' 不能应用于'decimal'和'decimal'类型的操作数
这当然也是有道理的.那我该怎么办?如果Sum事情只是在没有任何要求的情况下返回0 就会很好.或某种SumOrZero声明.制作一个适用SumOrZero于Linq2SQL 的方法会不会很难?
Svi*_*ish 22
这就是我现在最终的结果:
.Sum(æ => (decimal?) æ.Weight) ?? 0.0M,
Run Code Online (Sandbox Code Playgroud)
这就像一个魅力.
我仍然希望有一个SumOrZero我可以使用的,它可以像常规一样工作,Sum但它永远不会null因任何原因返回.就像其他人已经注意到的那样,这可能很容易制作,IEnumerable但创建起来有点icky,IQueryable所以它可以与Linq2SQL等一起工作.所以我现在就把它留在那里.虽然如果某人有一天感到无聊并SumOrZero为IQueryableLinq2SQL 编写了适用于所有数字类型的内容,请告诉我:D
在LINQ to Objects中,它很容易.使用LINQ to SQL会更难.您可以编写自己的扩展方法,该方法Queryable.Sum使用从普通表达式构建的表达式调用,并使用强制转换为可空类型.我怀疑你需要这样做?但是在调用代码中为0m.换句话说,你可以这样做:
.SumOrNull(æ => æ.Weight) ?? 0M,
Run Code Online (Sandbox Code Playgroud)
.SumOrNull的签名将是:
public static decimal? SumOrNull<TSource, decimal>(this IQueryable<TSource>,
Func<TSource,decimal> projection)
Run Code Online (Sandbox Code Playgroud)
你基本上可以为Queryable支持的所有值类型编写它.您可以一般性地编写它,并使用反射在Queryable中调用适当的方法,但这也会很蹩脚.
老实说,我认为你最好的是你拥有的东西.
| 归档时间: |
|
| 查看次数: |
6040 次 |
| 最近记录: |