Pada dasarnya ketika saya melakukan kueri berikut, jika tidak ada arahan yang cocok dengan kueri berikut akan melempar pengecualian. Dalam hal ini saya lebih suka memiliki jumlah menyamakan 0 daripada pengecualian yang dilemparkan. Apakah ini mungkin terjadi dalam permintaan itu sendiri - maksud saya daripada menyimpan permintaan dan memeriksa query.Any()
?
double earnings = db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId).Sum(l => l.Amount);
c#
.net
entity-framework
John Mayer
sumber
sumber
Where
akan kembalinull
jika tidak menemukan catatan, itu akan mengembalikan daftar item nol. Apa pengecualiannya?SQL
dihasilkannya.Amount
sebenarnya tidaknull
, itu benar-benar masalah seputar bagaimana menangani hasil nol. Lihatlah jawaban yang disediakan.decimal
, kode Anda harus digunakandecimal
. Lupakan yang pernah Anda kenalfloat
dandouble
dalam karier pemrograman Anda sampai suatu hari seseorang memberi tahu Anda untuk menggunakannya, untuk statistik atau pencahayaan bintang atau hasil dari proses stokastik atau muatan elektron! Sampai saat itu, Anda salah melakukannya .Jawaban:
Coba ubah kueri Anda menjadi ini:
Dengan cara ini, kueri Anda hanya akan memilih
Amount
bidang. Jika koleksi kosong, itu akan mengembalikan satu elemen dengan nilai0
dan kemudian jumlah akan diterapkan.sumber
Sum
mereka di sisi server, bukan di sisi database? solusi imo 2kay lebih optimal, setidaknya semantik benar.IQueryable<T>
rantai berhenti (biasanya ketika Anda meneleponToList
,AsEnumerable
, dll .. dan dalam hal iniSum
).Sum
adalah metode yang diketahui dan ditangani oleh Penyedia Queryable EF dan akan menghasilkan pernyataan SQL terkait.SELECT SUM(a.Amount) FROM (SELECT Amount FROM Leads WHERE ...) AS a
bukan hanya adilSELECT SUM(Amount) FROM Leads
. Subquery juga memiliki cek nol tambahan dan join luar aneh dengan tabel baris tunggal.DefaultIfEmpty
ini tidak didukung oleh sejumlah penyedia LINQ sehingga Anda harus memasukkanToList()
atau sesuatu yang serupa sebelum menggunakannya dalam kasus-kasus tersebut sehingga itu akan diterapkan dalam skenario LINQ to Objects .Saya lebih suka menggunakan hack lain:
sumber
Coba ini sebagai gantinya, ini lebih pendek:
sumber
Itu kemenangan bagi saya:
Di tabel LOGIN saya, di bidang NUMBEROFLOGINS beberapa nilai adalah NULL dan yang lain memiliki nomor INT. Saya menjumlahkan di sini total NUMBEROFLOGIN dari semua pengguna satu Korporasi (Setiap Id).
sumber
Mencoba:
Kueri " SELECT SUM ([Amount]) " akan mengembalikan NULL untuk daftar kosong. Tetapi jika Anda menggunakan LINQ itu mengharapkan bahwa " Jumlah (l => l.Amount) " mengembalikan dua kali lipat dan itu tidak memungkinkan Anda untuk menggunakan operator " ?? " untuk menetapkan 0 untuk koleksi kosong.
Untuk menghindari situasi ini, Anda perlu membuat LINQ mengharapkan " dua kali lipat? ". Anda dapat melakukannya dengan casting " (dobel?) L. Jumlah ".
Itu tidak mempengaruhi permintaan untuk SQL tetapi itu membuat LINQ bekerja untuk koleksi kosong.
sumber
sumber
ToList
sini jika yang Anda inginkan adalah jumlah. Ini akan mengembalikan set seluruh hasil (hanyaAmount
untuk setiap catatan dalam kasus ini) ke dalam memori dan kemudianSum()
set itu. Jauh lebih baik menggunakan solusi lain yang melakukan perhitungan melalui SQL Server.