TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);
// first get today's sleeping hours
List<Model.Sleep> sleeps = context.Sleeps.Where(
o => (clientDateTime - o.ClientDateTimeStamp < time24) &&
o.ClientDateTimeStamp.TimeOfDay > time18 &&
clientDateTime.TimeOfDay < time18 &&
o.UserID == userid).ToList();
Ekspresi Linq ini memunculkan pengecualian ini:
DbArithmeticExpression arguments must have a numeric common type.
Tolong bantu!
c#
entity-framework
ado.net
Nawaz Dhandala
sumber
sumber
clientDateTime - o.ClientDateTimeStamp
?Jawaban:
Aritmatika dengan
DateTime
tidak didukung di Entity Framework 6 dan sebelumnya. Anda harus menggunakan DbFunctions *. Jadi, untuk bagian pertama dari pernyataan Anda, seperti:Perhatikan bahwa
DiffHours
metode menerimaNullable<DateTime>
.Inti Entity Framwork (bila digunakan dengan Sql Server, mungkin penyedia db lain) mendukung
AddXxx
fungsi DateTime (sepertiAddHours
). Mereka diterjemahkan keDATEADD
dalam SQL.*
EntityFunctions
sebelum Entity Framework versi 6.sumber
Saya tahu bahwa ini adalah pertanyaan lama tetapi dalam kasus khusus Anda alih-alih menggunakan
DBFunctions
seperti yang disarankan oleh @GertArnold, tidak bisakah Anda membalikkan operasi, memindahkan aritmatika yang dimaksud dari Lambda?Toh
clientDateTime
dantime24
merupakan nilai fix sehingga perbedaannya tidak perlu dihitung ulang di setiap iterasi.Suka:
Refactor ini biasanya dapat dilakukan jika Anda mencoba membandingkan datetime yang disimpan yang digeser oleh stempel waktu tetap dengan datetime lainnya.
sumber
Sebaliknya, jika kinerja bukanlah tujuan yang sebenarnya, Anda dapat mencoba menggunakan
AsEnumerable()
. Jadi, akan seperti ituMenambahkan AsEnumerable () akan mengonversi kueri SQL menjadi entitas dan memungkinkan untuk menjalankan fungsi .Net pada kueri tersebut. Untuk info lebih lanjut, lihat di sini tentang AsEnumerable
sumber