Answers:
linq-to-sql查询不会作为代码执行,而是转换为SQL。有时,这是一种“泄漏抽象”,会产生意外的行为。
一种这样的情况是空值处理,在不同的地方可能会有意外的空值。...DefaultIfEmpty(0).Sum(0)
可以在这种(非常简单)的情况下提供帮助,在这种情况下,可能没有任何元素,并且sql的SUM
返回值是null
c#期望为0。
一种更通用的方法是,只要生成的SQL有返回意外的null的风险,??
就将其转换为COALESCE
:
var creditsSum = (from u in context.User
join ch in context.CreditHistory on u.ID equals ch.UserID
where u.ID == userID
select (int?)ch.Amount).Sum() ?? 0;
这首先int?
要告诉C#编译器null
,即使Sum()
返回一个,该表达式的确可以返回int
。然后,我们使用普通??
运算符处理该null
案件。
基于此答案,我写了一篇博客文章,其中详细介绍了LINQ to SQL和LINQ to Entities。
要允许可为空的Amount
字段,只需使用null合并运算符即可将null转换为0。
var creditsSum = (from u in context.User
join ch in context.CreditHistory on u.ID equals ch.UserID
where u.ID == userID
select ch.Amount ?? 0).Sum();
int?
第一个的原因。
Amount
是int
,则我们已经确定它不能为null,并且不需要合并。如果遇到错误,则说明该错误Amount
不可为空,而只是一个int
,在这种情况下,您可能需要在设计器中更改linq2sql dbml列以允许为空。
当我尝试从视图中进行选择时出现此错误消息。
问题在于视图最近获得了一些新的空行(在SubscriberId列中),并且尚未在EDMX中更新(首先是EF数据库)。
该列必须为Nullable类型才能工作。
var Dealer = Context.Dealers.Where(x => x.dealerCode == DealerCode).FirstOrDefault();
视图刷新之前:
public int SubscriberId { get; set; }
视图刷新后:
public Nullable<int> SubscriberId { get; set; }
在EDMX中删除并重新添加视图已成功。
希望它能帮助某人。
在运行时使用以下代码在Entity Framework 6中获得此错误:
var fileEventsSum = db.ImportInformations.Sum(x => x.FileEvents)
来自LeandroSoares的更新:
使用此命令执行一次:
var fileEventsSum = db.ImportInformations.Sum(x => (int?)x.FileEvents) ?? 0
原版的:
更改为此,然后它起作用:
var fileEventsSum = db.ImportInformations.Any() ? db.ImportInformations.Sum(x => x.FileEvents) : 0;