2016-04-12 27 views
0

Aşağıdakileri hayal edin:Ana liste eşleşen listeye göre başka listeden filtreleniyor

Bir veya daha fazla ülkeye atanabilecek bir Kişiniz var. aynı kişi üzerinde filtre hangi ülke, siteleri ve bölgeler seçebilirsiniz bir veya birden fazla sitelerde aynı kişi bir veya birden fazla bölgesinde

kullanıcı atanabilir atanabilir ve sadece o yerine bu kullanıcıları göstermelidir kriterleri.

Ben ve tüm kriterleri karşılayan kişi (kişi) filtrelemek mümkün olmanın en iyi şekilde anlamaya istediğiniz veri kaynağından bellek koleksiyonlarında kullanarak duyuyorum yani:

kullanıcı sitelerini seçebilir , bölgeler ve ülkeler ve bunların hepsi için, bu kritere uyan kişilerin listesini geri getirmek istiyorum.

Herhangi bir fikir nasıl?

ID 
Name 
Countries (List) 
Regions (List) 
Sites (List) 

Ben seçilmiş kriterleri karşılayan sadece bu kişiler beni almak için ana listesini filtrelemek için doğru LINQ sözdizimi anlamaya görünüyor olamaz şu şekildedir:

Kişi nesnenin yapıdır. Herhangi bir rehberlik takdir edilecektir. kullanıcı seçimi edelim söz hakkından kaydedilirse

+4

Filtre nesnesini gösterebilir misiniz? Filtre verilerini yönteminize nasıl geçirirsiniz? –

+1

Bu proje ile ilişkili bir çeşit veritabanı var mı? ve var olan bir şeman var mı? Öyleyse, bu veritabanıyla etkileşimde bulunmak için hangi çerçeveyi kullanıyorsunuz ve şema –

+0

da nedir? Ülkeler, Bölgeler ve Siteler arasında herhangi bir ilişki var mı? –

cevap

1
var countryIdsToCheck = new List<int> { 1,3,5 }; 
var regionIdsToCheck = new List<int> { 6,8 }; 
var siteIdsToCheck= new List<int> { 35 }; 

var result = yourDbContext.Persons; 
if(countryIdsToCheck.Any()) 
{ 
    result= result.Where(s=>s.Countries.Any(x=>countryIdsToCheck.Contains(x.Id)); 
} 
if(regionIdsToCheck.Any()) 
{ 
    result= result.Where(s=>s.Regions.Any(y=>regionIdsToCheck .Contains(y.Id)); 
} 
if(siteIdsToCheck.Any()) 
{ 
    result= result.Where(s=>s.Sites.Any(z=>siteIdsToCheck.Contains(z.Id)); 
} 
var finalResult=result.ToList(); 

Ya tek astar üzerine filtreleme olurdu

var result = yourDbContext.Persons 
       .Where(s=>s.Countries.Any(x=>countryIdsToCheck.Contains(x.Id)) 
        || s.Regions.Any(y=>regionIdsToCheck.Contains(y.Id)) 
        || s.Sites.Any(z=>siteIdsToCheck.Contains(z.Id))).ToList(); 

ToList() çağrı gerekli değildir. Hızlı izleme ve kesme noktaları ile hata ayıklamanıza yardımcı olacak şekilde ekledim (ToList() İfadeyi yürütün ve sonucu yeni bir liste kopyalayın (istekli yükleme))

+0

Teşekkürler arasında hiçbir ilişki yoktur. Bunun işe yaradığına inanıyorum (artık veri bütünlüğü sorunları var). FYI dbContext'e erişimim yok, ancak fark etmez. Tekrar teşekkürler. –

+0

ve sonra 'YourDbContext.Persons' ile veritabanı tablo (lar) – Shyju

+0

gelen Kişi toplanması yerine evet biliyorum. Sadece bir yorum yapıldı :) –

1

:

Sonra
var chosenCountries = new List<Country>(); 
var chosenRegions = new List<Region>(); 
var chosenSite = new List<Site>(); 

basitçe bu

var result = persons; 
if(chosenCountries.Any()) 
{ 
result = result.Where(p=>p.Countries.Any(c=>chosenCountries.Any(cc=>cc.Id == c.Id)); 
} 
if(chosenRegions.Any()) 
{ 
result = result.Where(p=>p.Regions.Any(r=>chosenRegions.Any(cr=>cr.Id == r.Id)); 
} 
return result.Distinct().ToList(); 
0

Filtre nesnesinin görünmesi durumunda başka bir alternatif göstereceğim. :

public class Filter 
{ 
    public int CountryID; 
    public int RegionID; 
    public int SiteID; 
} 

var filter = new List<Filter>(); 

var result = persons.Where(p => 
     filter.Any(f => p.Countries.Any(c => c.ID == f.CountryID) && 
        f => p.Regions.Any(r => r.ID == f.RegionID) && 
        f => p.Sites.Any(s => s.ID == f.SiteID))); 
İlgili konular