2010-07-20 6 views
10

Lottano un po 'oggi.Se le istruzioni all'interno di una clausola Linq dove

Ho il seguente metodo che restituisce un elenco di prodotti..lovely.

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(); 
  • Dove Parti principali & fonte sono elenchi a discesa.

Come faccio a incorporare alcune istruzioni IF nella clausola where?

Ad esempio, se il ddl del materiale di base non viene toccato ma viene selezionato un elemento nel ddl di origine, il risultato restituisce tutto ciò che è associato al materiale di base ma viene filtrato dalla sorgente selezionata.

Questo ha senso ?!

Non sono nemmeno sicuro che sto adottando l'approccio corretto. Per favore perdona la mia ignoranza.

+1

È possibile chiarire "se il ddl di base non viene toccato ma è selezionato un elemento nel ddl di origine"? – bits

+0

DDL significa cosa in questo contesto? –

+0

Bit di scusa - Quindi se un utente non seleziona nulla dall'elenco a discesa del materiale di base, in sostanza il set di dati non sarà 'filtrato' da questo criterio. Elenco a discesa –

risposta

16

è possibile aggiungerli alla tua richiesta sulla necessità:

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

Ciao Moi - grazie mille per questa soluzione, mi ha aiutato molto ed è semplice da implementare. –

10

considerare l'implementazione di questi metodi di estensione di nome WhereIf.

Si passa a due parametri: un'istruzione valutata su un valore booleano e una funzione lambda. Se l'istruzione bool restituisce true, viene aggiunta la lambda.

WhereIf on ExtensionMethod.net

Vostri criteri potrebbe sembrare:

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(); 

Eccoli, sia per IEnumerable e IQueryable. Ciò consente di utilizzare .WhereIf() in LINQ a SQL, Entity Framework, elenchi, matrici e qualsiasi altra cosa che implementa queste 2 interfacce.

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

Hey there p..campbell - grazie per il tuo contributo, mi ha dato molti spunti di riflessione. Tuttavia, ho implementato la soluzione di moi così marcata che come risposta. Tuttavia, sono sicuro che ad un certo punto userò la soluzione, quindi risponderò il più possibile. –

+2

Per IQueryable ho dovuto aggiungere .AsQueryable() al ritorno: 'return source.Where (predicate). AsQueryable();' –