2015-12-04 18 views
11

Eski projeyi Linq2Sql'den EF6'ya taşımaya çalışıyorum ve aşağıdaki sorunlarım var.EF 6 çocuk koleksiyonlarını filtrelemek

Bu proje (yani tüm metinler fazla 1 çevirisini var) çok dilli ve ben şu var db yapısı: Bütün ExampleEntity1 göre filtrelenmiş tüm LocalizedContent kayıtları ile nesneleri almanın en iyi yolu nedir

Example of DB tables

geçerli dil kimliği dc.ExampleEntity1.Include(ee => ee.TextEntry.LocalizedContents);

Linq2SQL ben loadOptions.AssociateWith kullanarak LocalizedContent kayıtlarını filtre edebilirsiniz ama Ef6 türlü çözüme bulamıyor:

Aşağıdaki kodu kullanarak tüm LocalizedContent kayıtları ile tüm ExampleEntity1 nesneleri yükleyebilirsiniz.

Benzer eski soruları gördüm (2-3 yıl önce gönderilmiş gibi) ve sadece EF6 için bir çözüm olup olmadığını merak ediyorum. Bu benim için çok önemli bir özellik çünkü projede düzinelerce varlığım var ve her bir seçim sorgusu için özel nesneler oluşturmak istemiyorum. o filtrelemek mümkün değil

+0

Akla gelen ancak durumunuz için çalışmayabilecek bir seçenek: geçerli dil kimliğini ve TextEntryId öğesini alan ve doğru LocalizedContents öğesini döndüren özel bir veritabanı işlevi. Sadece bazı fikirleri umarım tutuşturmak için dışarı atıyoruz. –

+0

sadece ilginiz dışında ... neden fakefield'i textentry üzerinde localisedContent'e taşıyorsunuz ve masadaki metinleri düşürmüyorsunuz, bu hiçbir şeyi kaybetmeden işleri basitleştiremezdi. o zaman başka bir bağlantı tablosu üzerinden gitmek zorunda kalmayacaksınız .... hangi fakefield dışında eklediğini göremiyorum ... hangi localisedContent için hareket olabilir ... – Seabizkit

+0

Eğer yerli EF yöntemleri kullanmak istiyorsanız, EF6'nın yeni kesişme API'siyle komuta ağaçlarını durdurmayı bitireceğim. Bunu yaparsanız, sonunda EntityFramework.DynamicFilters'ı yeniden keşfedeceksiniz. Nuget paketine giderdim. –

cevap

1

Not olduğunu ..

Ben de konuyla yardımcı olabilir EntityFramework.DynamicFilters Nuget paket buldum ama "yerli" Ef6'yı işlevselliği mümkünse kullanmayı tercih ediyorum hangi ilgili varlıkları yüklenir. Dahil et, her zaman ilgili varlıklarını getirecektir.

Msdn Reference

var result = dc.ExampleEntity1.Include(ee =>ee.TextEntry.LocalizedContents) 
       .Select(x=>new 
       { 
        //Try anonymous or a projection to your model. 
        //As this Select is IQuerable Extension it will execute in the data store and only retrieve filtered data. 
        exampleEntity = x, 
        localizedContetnt = x.TextEntry.LocalizedContents.Where(g=>g.Id==YourKey), 
       }).FirstOrDefault(); 

Sen Dahil edilen işletmelerdeki içeriğini filtre anonymous projection deneyebilirsiniz

Varlık çerçeve ekibi Oyunuzu olabilir bu üzerinde çalışıyor here

Similar Answer

+0

EF'de her şeyin belirtilmesi gerektiğini düşündüm .. yani 'dc.ExampleEntity1.Include (ee => ee.TextEntry) .Include (ee => ee.TextEntry.LocalizedContents)' bu yeteneği eklediler mi? LocalizedContents tablosuna erişmek için liniking tablosuna ihtiyaç duyduğunu bilir. Bu değer – Seabizkit

-1

SINIRSIZ DENEME Çalışmaları nasıl dahil ettiğinden dolayı performans açısından mükemmel değil ... Elle yapacağım ama burada neler yapabileceğinize dair bir örnek.

var result = dc.ExampleEntity1 
      .Include(x => x.TextEntry) 
      .Include(x => x.TextEntry.LocalizedContents) 
      .Include(x => x.TextEntry.LocalizedContents.Local) 
      .Where(x => x.id == 'ExampleEntity1Key' 
         && x.TextEntity.LocalContent.Local.Id == 'Value' 
      ) 
      .FirstOrDefault(); 

Bu Yerel bir kimlik üzerinde eşleştirilir yüklenen istekli tüm navigasyon ExampleEntity1 bir nesne .... ile bitirmek istiyorum.

sonra .. gibi

var listLocalsForExampleEnitity = result.TextEntry.LocalizedContents.Local.ToList(); 

Yerel olsun ya da sadece onlar mem zaten zamanki gibi yerden onları diyebiliriz.Eğer kullanmak zorunda (Ef6 itibariyle) daha sonra veritabanına sorguda süzme işlemini gerçekleştirmek istiyorsanız

Umut bu

2

yardımcı Query method:

Sorgu yöntemi erişim sağlar İlgili varlıkları yüklerken Varlık Çerçevesinin kullanacağı temel sorgu. Ardından vb ToList, Load gibi bir LINQ uzantısı yöntemi çağrısı ile çalıştırmadan önce sorguya filtreleri uygulamak için LINQ kullanabilirsiniz

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Load the posts with the 'entity-framework' tag related to a given blog 
    context.Entry(blog) 
    .Collection(b => b.Posts) 
    .Query() 
    .Where(p => p.Tags.Contains("entity-framework") 
    .Load(); 

    // Load the posts with the 'entity-framework' tag related to a given blog 
    // using a string to specify the relationship 
    context.Entry(blog) 
    .Collection("Posts") 
    .Query() 
    .Where(p => p.Tags.Contains("entity-framework") 
    .Load(); 
} 

Ancak bariz dezavantajı yapmanız gereken olmasıdır Bu giriş başına ve her Load çağrı veritabanına karşı bir sorgu yürütür.

Sizin için zor bir gereklilik olmadıkça, tüm yerelleştirmeleri yüklemeyi ve yalnızca seçili dili kullanmak için bellekte filtrelemeyi tercih ederim. Eminim performansın bir sorun olmayacağından eminim.

+1

değeri ... benden 1 yukarı. – Seabizkit