2010-07-20 17 views
10

Trochę się dzisiaj zmagam.Jeśli instrukcje w Linq gdzie klauzula

Mam następującą metodę, która zwraca listę produktów..poprawnie.

public static List<tblWeight> GetProductInfo(string memberid, string locationid, string basematerial, string source) 
     { 
      MyEntities getproductinfo = new MyEntities(); 

      return (from p in getproductinfo .tblWeights 
         where p.MemberId == memberid && 
           p.LocationId == locationid && 
           p.BaseMaterialName == basematerial && 
           p.WeightStatus == source 
         select p) 
         .ToList(); 
  • Gdzie Części główne & źródłem są rozwijanych list.

Jak mam wprowadzić kilka zdań IF do klauzuli where?

Na przykład, jeśli podstawowe materiały ddl nie zostaną dotknięte, ale wybrana jest pozycja w źródłowym ddl, wynik zwróci wszystko, co jest powiązane z materiałem bazowym, ale zostanie przefiltrowane przez wybrane źródło.

Czy to ma nawet sens ?!

Nie jestem nawet pewien, czy podejmuję właściwe podejście - proszę wybaczyć moją niewiedzę.

+1

Czy można wyjaśnić "jeśli nie zostanie dotknięty podstawowy materiał ddl, ale wybrano element ze źródła ddl"? – bits

+0

DDL oznacza co w tym kontekście? –

+0

Wybrane bity - jeśli więc użytkownik nie wybierze niczego z rozwijanej listy materiałów podstawowych, to zasadniczo zbiór danych nie zostanie "przefiltrowany" według tego kryterium. –

Odpowiedz

16

można dodać je do swojego zapytania na potrzeby:

var r = (from p in getproductinfo .tblWeights 
         where p.MemberId == memberid && 
           p.LocationId == locationid && 
           p.WeightStatus == source 
         select p) 

if (!String.IsNullOrEmpty(basematrial)) 
    r = r.Where(p => p.BaseMaterialName == basematerial); 

return r.ToList(); 
+0

Witaj Moi - bardzo dziękuję za to rozwiązanie, bardzo mi pomógł i jest prosty w implementacji. –

10

rozważyć wdrożenie tych metod rozszerzenie nazwane WhereIf.

Przekażemy dwa parametry: instrukcję obliczoną na wartość logiczną i funkcję lambda. Jeśli instrukcja bool jest równa true, dodaje się lambda.

WhereIf on ExtensionMethod.net

Zapytanie może wyglądać tak:

return getproductinfo.tblWeights 
      .Where(w=> w.MemberId == memberid && 
        w.LocationId == locationid) 
      .WhereIf(!string.IsNullOrEmpty(basematerial), w=>w.BaseMaterialName == basematerial) 
      .WhereIf(!string.IsNullOrEmpty(source), w=>w.WeightStatus == source)       
      .ToList(); 

Oto one, zarówno IEnumerable i IQueryable. Pozwala to na użycie LINQ To SQL, Entity Framework, Lists, Arrays i innych elementów implementujących te 2 interfejsy.

public static IEnumerable<TSource> WhereIf<TSource>(this IEnumerable<TSource> source, bool condition, Func<TSource, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 

public static IEnumerable<TSource> WhereIf<TSource>(this IEnumerable<TSource> source, bool condition, Func<TSource, int, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, int, bool> predicate) 
{ 
    if (condition) 
     return source.Where(predicate); 
    else 
     return source; 
} 
+0

Hej tam p..campbell - dzięki za twój wkład, dało mi mnóstwo jedzenia do przemyślenia. Jednak zaimplementowałem rozwiązanie Moi tak oznaczone jako odpowiedź. Jestem jednak pewien, że wykorzystam twoje rozwiązanie w pewnym momencie, więc będę podnosił odpowiedź tak bardzo, jak tylko mogę. –

+2

Dla IQueryable musiałem dodać .AsQueryable() do zwrotu: 'return source.Where (predicate) .AsQueryable();' –