2012-06-16 17 views
6

IQueryable türü üzerinden, bir varlık alt kümesi alan ve bazı ölçütler üzerine bunları filtreleyen bir uzantı yöntemi oluşturdum. Benim sorunum, ilk başta hiç başlatılmadan değişkenlerden oluşan bir Birlik ifadesini döndüremem. Anonim olarak boş değerler geçerli değil.Bir Union ifadesi kullanmadan önce IQueryable değişkenlerini nasıl başlatmalıyım?

public static IQueryable<Person> FilterHairColors(this IQueryable<Person> subQuery, string[] hairColors) 
    { 
     IQueryable<Person> q1 = null; 
     IQueryable<Person> q2 = null; 
     IQueryable<Person> q3 = null; 
     IQueryable<Person> q4 = null; 

     foreach (var value in hairColors) 
     { 
      switch (value) 
      { 
       case "1": 
        q1 = subQuery.Where(p => p.HairColor_bright == true); 
        break; 
       case "2": 
        q2 = subQuery.Where(p => p.HairColor_brown == true); 
        break; 
       case "3": 
        q3 = subQuery.Where(p => p.HairColor_dark == true); 
        break; 
       case "4": 
        q4 = subQuery.Where(p => p.HairColor_red == true); 
        break; 
      } 
     } 
     return q1.AsQueryable().Union(q2.AsQueryable()).Union(q3.AsQueryable()).Union(q4.AsQueryable()); 
    } 

, sunulan kod bloğu birkaç tane daha parçasıdır ve her veri alt kümesini üreten bir sonraki filtreleme yöntemine bu şekilde iletti:

results = persons.FilterGender(vm.gender).FilterAge(vm.age).FilterHeight(vm.height)...... 

cevap

3

Birliği deme zaman biri argümanlar boş.

"Boş sorgu" ne anlama geliyor? "Satır yok" anlamına gelirse, o zaman Sendika'yı değil. "Tüm satırlar" anlamına gelirse, kaynaştırmanıza gerek yoktur, çünkü temeldeki filtrelenmemiş sorguyu alabilirsiniz. Bunun gibi

:

var result = new [] { q1, q2, q3, q4, }.Where(query => query != null).Aggregate(Queryable.Union); 

Bu kullanıyor LINQ Nesneler bir LINQ SQL sorgusu oluşturmak için.

yeni bir sürümü: o hiç çalışma zamanı maliyetine sahip olacak şekilde

var result = dataContext.Persons.Where(_ => false); 
if(q1 != null) result = result.Union(q1); 
if(q2 != null) result = result.Union(q2); 
if(q3 != null) result = result.Union(q3); 
if(q4 != null) result = result.Union(q4); 

SQL Server sorgu iyileştirici ilk kukla sorgu kaldıracaktır.

+0

O zaman Birliği null olmayan değişkenlerle gerçekleştirmeyi nasıl koşullandırmalıyım? –

+0

Bir teklif ekledim. – usr

+0

Teşekkürler 'usr'. Sorunuma erişmek için daha basit, sezgisel bir yol düşünebilir misin? –

1
public static IQueryable<Person> FilterHairColors(this IQueryable<Person> subQuery, string[] hairColors) 
{ 
    var result = new Person[] { }.AsQueryable(); 
    var contains = new Dictionary<string, Expression<Func<Person, bool>>>(); 

    contains.Add("1", p => p.HairColor_bright); 
    contains.Add("2", p => p.HairColor_brown); 
    contains.Add("3", p => p.HairColor_dark); 
    contains.Add("4", p => p.HairColor_red); 

    foreach (var color in hairColors) 
    { 
     result = subQuery.Where(contains[color]).Union(result); 
    } 

    return result; 
} 
+0

Bunu denedim ve Bu hata ile geldi: "Bu yöntem, Entity altyapısına LINQ destekler ve doğrudan kodunuzdan kullanılmak üzere tasarlanmamıştır". http://social.msdn.microsoft.com/Forums/is/adodotnetentityframework/thread/3962b925-fe1e-4b96-ade3-5cb3b4be4511 –

İlgili konular