2016-03-31 16 views
2

merak ediyorumkullanma İfade Sınıf

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1 

var items = from item in context.TEntity 
where expression 
select item 

nerede olarak kullanıyor LINQ işlevini yapmanın bir yolu olduğunu biliyorum fonksiyon parametre olarak bir ifade alır ama gerçekten bu kullanarak LINQ

notu sorgular yapmanız gerekir: yukarıdaki kod Ben gerçek bir çalışma kodu

değil yapmaya çalıştığım şey almak çevrede yapmak için sadece bir örnektir

not 2: Enti ile çalışmak için buna ihtiyacım var ty Çerçeve

cevap

3

Ne yazık ki, Entity Framework, bu tür bir yansıtma yansıtma biçimini doğal olarak desteklemez; bu nedenle, where expression.Compile().Invoke(item); gibi yaygın bir girişim, çalışma zamanında bir istisna atar. Eğer (Expression Ziyaretçi kullanır) LinqKit kütüphane kullanımı ve taraf sette .AsExpandable() çağırırsanız

Ancak, daha sonra dinamik olarak ifade çağırabilirsiniz:

Expression<Func<TEntity, bool>> expression = x => x.Id == 1; 

var items = from item in context.Set<TEntity>.AsExpandable() 
where expression.Invoke(item) 
select item; 
+0

tanımıyor çünkü, orada çalışmaz. Bu Invoke, AsExpandable ile birlikte çalışan bir Linqkit uzantısı yöntemidir. –

+1

LinqKit kullanarak iyi çalışıyor, ben + 1'ed – Jcl

+0

@DavidL, ahh, şimdi anlamıyorum. Güncelleme için teşekkürler. –

1

Bu, en az EF Core işleri (Sadece test ettim). Test edebileceğim herhangi bir EF6 projeniz yok.

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1 

var items = from item in context.TEntity 
where expression.Compile()(item); 
select item 

Güncelleme: Sadece Ef6 üzerinde basit bir test projesi yaptı ve anlatım başlatılmasına doğru Whoops

+0

EF Core üzerinde çalıştığım için gerçekten şaşırdım ... Yerel filtrelemeyi (desteklenmeyi planladığını duydum) veya gerçekten SQL'e dönüştürüp dönüştürmediğini kontrol etmeliyim, fakat şu anda bunun için zamanım yok. – Jcl

+2

Gerçekten yerel filtreleme yapar. Bu nedenle, çalışma zamanı istisnasını ortadan kaldırdılar, ancak günlüğe kaydetmeyi ve db tarafında gerçekleştirildiğinden emin olmak için her sorguyu kontrol etmeniz gerekiyor. –

+0

@IvanStoev evet, bu benim tahminimdi ... Günlüğü etkinleştirmeyi denedim ama tutarlı bir yol yok gibi görünüyor ve bunu test etmek için fazla zamanım yoktu (3 farklı şekilde 3 kez değiştirdiler sürümleri ve bir github sorun üzerinde bulduğum son yöntem yayınlanan nuget paketleri ile çalışmadı) – Jcl

İlgili konular