Bu satırları içeren büyük bir Entity Framework sorgum var. Verileri gerçekleşmek zamanToplam() Entity Framework Query'de null döndürüyor
var programs = from p in Repository.Query<Program>()
where p.OfficeId == CurrentOffice.Id
let totalCharges = p.ProgramBillings.Where(b => b.Amount > 0 && b.DeletedDate == null).Select(b => b.Amount).Sum()
let totalCredits = p.ProgramBillings.Where(b => b.Amount < 0 && b.DeletedDate == null).Select(b => -b.Amount).Sum()
let billingBalance = (totalCharges - totalCredits)
, aşağıdaki hatayı alıyorum: Ben (iki tip atmalarını eklenen) aşağıdaki gibi benim sorguyu değiştirirseniz
The cast to value type 'Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.
, hata kaybolur.
var programs = from p in Repository.Query<Program>()
where p.OfficeId == CurrentOffice.Id
let totalCharges = (decimal?)p.ProgramBillings.Where(b => b.Amount > 0 && b.DeletedDate == null).Select(b => b.Amount).Sum()
let totalCredits = (decimal?)p.ProgramBillings.Where(b => b.Amount < 0 && b.DeletedDate == null).Select(b => -b.Amount).Sum()
let billingBalance = (totalCharges - totalCredits)
Bunu anlamıyorum. ProgramBilling.Amount
, null olmayan bir Ondalıktır. Interkisense, Sum()
aramasının üzerine geldiğimde, Ondalık tipi döndürdüğünü söylüyor. Yine de ek testler, ikinci versiyonumda,ve totalCredits
'un her ikisi de ProgramBillings
'un veri içermediği satırlar için null olarak ayarlandığını doğruladı.
Sorular:
Ben
Sum()
boş koleksiyonu için 0 döndürdü anladı. Hangi koşullar altında bu doğru değil mi?Ve bazen bu doğru değilse, neden
Sum()
üzerinde gezindiğimde, Intellisense ondalık ve Ondalık değil tipini döndürdüğünü gösterir? Görünüşe göre Intellisense sahip olduğum aynı anlayışa sahipti.
DÜZENLEME:
Bu kolay bir düzeltme Sum() ?? 0m
böyle bir şey yapmak olduğunu görünüyor. Ama bu bana hata veren yasadışı:
Operator '??' cannot be applied to operands of type 'decimal' and 'decimal'
Bu gönderiye baktınız: http://stackoverflow.com/questions/17593371/how-to-force-linq-sum-to-return-0-while-source-collection-is-empty –
@JonathanWood: "Ama yine de bunun neden gerekli olduğu konusunda kafam karıştı" tekrar bağlantılı sorunun başlığını oku. Gerekli çünkü koleksiyon boş. Boş bir koleksiyonun toplamının null değilse ne olmasını isterdiniz? Açıkça '0', '0' bir toplam için mükemmel geçerli bir değer olduğundan kesmiyor. –
@DavidTansey: Bunu gördüm, ama sorumun sonunda sorduğum soruların hiçbiri hakkında hiçbir ipucu vermiyor. Gerektiği gibi alacağım yaklaşım budur. Sadece nedenini anlamak istedim. –