Bir özellik Kimliği seçmek ve bir kimlik listesiyle karşılaştırmak için bir Func alan varlık uzantısı yöntemine bir linq yazmaya çalışıyorum. YöntemLinq'den Entity Framework ile bir ifadede Func nasıl kullanılır?
var ids = new List<int> { 1, 2, 3 };
DbContext.EntityAs.WithId(e => e.AId, ids);
DbContext.EntityBs.WithId(e => e.BId, ids);
Ben sorun çağrılması
Sınıflar
public class A
{
public int AId { get; set; }
}
public class B
{
public int BId { get; set; }
}
Uzatma Yöntemi
public static IQueryable<T> WithId<T>(this IQueryable<T> entities,
Func<T, int> selector, IList<int> ids)
{
Expression<Func<T, bool>> expression = x => ids.Contains(selector(x));
return entities.Where(expression); // error here (when evaluated)
}
deneyimleme, Entity Framework'de izin verilmeyen işlevi çağırmaya çalıştığıdır.
Sorguyu değerlendirmek için özellik seçici (Func) nasıl kullanabilirim?
Bir EF sorgusunda çağırabileceğiniz kod kapsamı, yine de SQL'de çevrilmesi gereken bir gerçektir. Sizin durumunuzda EF, bir IList'in otomatik olarak nasıl çevrileceğini bilmiyor. –
Bu konuda doğru olduğundan emin değilim. DbContext.EntityAs.Where (e => ids.Contains (e.Id)) EF tarafından doğru bir şekilde çevrilmiştir. Yeniden kullanılabilir bir işlev yapmaya çalışıyorum, böylece hangi özelliği seçeceğimi tanımlayabilirim. – David
EF, nasıl numaralandırılacağını bildiği için, x değeri (1,2,3) içinde numaralandırılabilir (x) 'i seçebilir veya başka bir varlık ilişkisi durumunda x' i (select y) 'yi seçin. Sizin durumunuzda, EF, x'i seçin, x'i seçin (F'yi (y) (F (1), F (2), ...)) 'de seçin. Bunu elle yapmak mümkün olsa da EF sadece durumu desteklemiyor * henüz * –