Dalam menggunakan EntityFramework , saya mendapatkan " A lambda expression with a statement body cannot be converted to an expression tree
" kesalahan ketika mencoba mengkompilasi kode berikut:
Obj[] myArray = objects.Select(o =>
{
var someLocalVar = o.someVar;
return new Obj() {
Var1 = someLocalVar,
Var2 = o.var2 };
}).ToArray();
Saya tidak tahu apa artinya kesalahan dan sebagian besar cara memperbaikinya. Ada bantuan?
c#
linq
entity-framework
linq-to-entities
pistacchio
sumber
sumber
Jawaban:
Apakah
objects
konteks basis data Linq-To-SQL? Dalam hal ini, Anda hanya dapat menggunakan ekspresi sederhana di sebelah kanan operator =>. Alasannya adalah, ekspresi ini tidak dieksekusi, tetapi dikonversi ke SQL untuk dieksekusi terhadap database. Coba inisumber
Anda dapat menggunakan tubuh pernyataan dalam ekspresi lamba untuk koleksi IEnumerable . coba yang ini:
Perhatian:
Pikirkan baik-baik ketika menggunakan metode ini, karena dengan cara ini, Anda akan memiliki semua hasil query dalam memori, yang mungkin memiliki efek samping yang tidak diinginkan pada sisa kode Anda.
sumber
AsEnumerable()
topeng, masalah saya hilang!Ini berarti bahwa Anda tidak dapat menggunakan ekspresi lambda dengan "tubuh pernyataan" (yaitu ekspresi lambda yang menggunakan kurung kurawal) di tempat-tempat di mana ekspresi lambda perlu dikonversi ke pohon ekspresi (yang misalnya kasus ketika menggunakan linq2sql) .
sumber
Tanpa mengetahui lebih banyak tentang apa yang Anda lakukan (Linq2Objects, Linq2Entities, Linq2Sql?), Ini akan membuatnya bekerja:
sumber
.AsEnumerable()
Gunakan kelebihan pilih ini:
sumber
Expression<Func<Obj,Obj>>
.LINQ to SQL return object mengimplementasikan
IQueryable
antarmuka. Jadi untukSelect
parameter predikat metode, Anda hanya boleh menyediakan ekspresi lambda tunggal tanpa body.Ini karena LINQ untuk kode SQL tidak dijalankan di dalam program daripada di sisi terpencil seperti SQL server atau lainnya. Tipe eksekusi lazy loading ini dicapai dengan mengimplementasikan IQueryable di mana delegasi ekspektasinya dibungkus dalam kelas tipe Ekspresi seperti di bawah ini.
Pohon ekspresi tidak mendukung ekspresi lambda dengan tubuh dan hanya mendukung ekspresi lambda baris tunggal seperti
var id = cols.Select( col => col.id );
Jadi, jika Anda mencoba kode berikut tidak akan berfungsi.
Berikut ini akan berfungsi seperti yang diharapkan.
sumber
Ini berarti bahwa ekspresi tipe Lambda
TDelegate
yang berisi a([parameters]) => { some code };
tidak dapat dikonversi keExpression<TDelegate>
. Itu aturannya.Sederhanakan kueri Anda. Yang Anda berikan dapat ditulis ulang sebagai berikut dan akan dikompilasi:
sumber
Apakah
Arr
tipe dasarObj
? Apakah kelas Obj ada? Kode Anda hanya akan berfungsi jika Arr adalah tipe dasar dari Obj. Anda dapat mencoba ini sebagai gantinya:sumber
Untuk kasus spesifik Anda, tubuh adalah untuk membuat variabel, dan beralih ke
IEnumerable
akan memaksa semua operasi untuk diproses di sisi klien, saya mengusulkan solusi berikut.Sunting: Ganti nama untuk C # Coding Convention
sumber