Saya akan membiarkan kodenya berbicara sendiri:
public interface ISoftDeletable {
bool IsDeleted {get; set;}
}
public static class Extensions {
public IQueryable<T> Active<T>(this IQueryable<T> q) where T : ISoftDeletable {
return q.Where(t => !t.IsDeleted);
}
}
public partial class Thing : ISoftDeletable {
...
}
...
var query = from tc in db.ThingContainers
where tc.Things.Active().Any(t => t.SatisfiesOtherCondition)
select new { ... }; // throws System.NotSupportedException
Kesalahannya adalah:
LINQ ke Entitas tidak mengenali metode metode 'System.Collections.Generic.IQueryable`1[Thing] ActiveThing', dan metode ini tidak dapat diterjemahkan ke dalam ekspresi penyimpanan.
Anda mendapatkan idenya: Saya ingin cara yang lancar untuk mengekspresikan hal ini sehingga untuk ISoftDeletable
apa pun saya dapat menambahkan klausa 'di mana' dengan potongan kode sederhana yang dapat digunakan kembali. Contoh di sini tidak berfungsi karena Linq2Entities tidak tahu apa yang harus dilakukan dengan metode Active()
saya.
Contoh yang saya berikan di sini sederhana, tetapi dalam kode asli saya, ekstensi Active()
berisi serangkaian kondisi yang jauh lebih rumit, dan saya tidak ingin menyalin dan menempelkannya ke seluruh kode saya.
Ada saran?
Active
dalam gabungan. - person Jon Skeet   schedule 29.08.2013Active
, yang tidak sama dengan memanggilActive
sendiri (seperti sebelumnya). - person Jon Skeet   schedule 29.08.2013