2016-05-26 36 views
5

Ho due classi:C# - LINQ dinamica da una condizione lista

public class Customer 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public List<Product> Product { get; set; } 
} 

public class Product 
{ 
    public string ProductNumber { get; set; } 

    public string ProductColor { get; set; } 
} 

E un esempio:

Customer[] c = new Customer[] 
{ 
    new Customer() 
    { 
     FirstName = "FirstName1", 
     LastName = "LastName1", 
     Product = new List<Product> 
     { 
      new Product() 
      { 
       ProductColor = "ProductColor1", 
       ProductNumber = "11" 
      } 
     } 
    }, 
    new Customer() 
    { 
     FirstName = "FirstName2", 
     LastName = "LastName2", 
     Product = new List<Product> 
     { 
      new Product() 
      { 
       ProductColor = "ProductColor2", 
       ProductNumber = "12" 
      } 
     } 
    } 
}; 

Io uso System.Dynamic.Linq biblioteca per filtrare la mia matrice:

var filter = c.Where("FirstName == \"FirstName1\"").Select(x => x).ToList();

Creo una classe condition e un'istanza:

public class condition 
{ 
    public string propertyName { get; set; } 

    public string propertyValue { get; set; } 
} 

List<condition> f = new List<condition> 
{ 
    new condition() 
    { 
     propertyName = "FirstName", 
     propertyValue = "FirstName1" 
    }, 
    new condition() 
    { 
     propertyName = "Product.ProductColor", 
     propertyValue = "11" 
    } 
}; 

voglio creare clausola multipla Where da questo List<Condition>

Come fare questo?

+2

Puoi mostrare il codice in cui attualmente si applica una condizione all'elenco? Dovrebbe essere semplice come 'var toFilter = sourceCollection.AsEnumerable(); foreach (condizione var in condizioni) {toFilter = toFilter.Where (condizione); } '. – CodeCaster

+0

Il tipo di stringa di tutte le marche è di tutti i tipi? –

+0

No, tutte le proprietà non sono stringhe di tipo –

risposta

1

Da quello che riesco a raccogliere è solo un semplice caso di eseguire questo nella tua lista? A meno che non manchi qualcosa?

var query = f.Where(x => x.propertyName == "FirstName" && x.propertyValue == "FirstName1"); 
+0

La mia lista delle condizioni proviene da un file di configurazione –

+0

Questo può aiutare, http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library c'è un file scaricabile libreria dinamica linq con esempi anche qui - http://msdn2.microsoft.com/en-us/vcsharp/bb894665.aspx – nik0lias

+0

Bene con gli esempi forniti dal collegamento è possibile creare una stringa per rappresentare l'istruzione where, ad esempio - f. Where ("propertyName = @ 0 e propertyValue = @ 1", "SomeNameHere", "SomeOtherValue"); Quindi puoi creare una stringa in modo dinamico. – nik0lias

0

Per risolvere il problema ho modificato un po 'la classe condizione follwoing:

Una condizione per una potenza cliente contiene un elenco di condizioni di prodotto:

public class Condition 
    { 
     public string propertyName { get; set; } 
     public string propertyValue { get; set; } 
     public ICollection<Condition> Conditions { get; set; } 
    } 

per crearlo :

List<Condition> f = new List<Condition> 
    { 
    new Condition() 
    { 
     propertyName = "FirstName", 
     propertyValue = "FirstName1", 
     Conditions = new List<Condition> 
     { 
     new Condition 
     { 
      propertyName = "ProductColor", 
      propertyValue = "11" 
     } 
     } 
    }, 
    }; 

ora è possibile utilizzare la query di seguito per filtrare il cliente e t i prodotti con le condizioni date:

var filteredCustomers = 
       from condition in f 
       from custmer in c 
       from product in custmer.Product 
       let propertyName = condition.propertyName 
       let propertyValue = condition.propertyValue 
       where (nameof(custmer.FirstName) == propertyName && custmer.FirstName == propertyValue) 
        && 
        (condition.Conditions.Any(p => p.propertyName == nameof(product.ProductColor)) 
        && condition.Conditions.Any(p => p.propertyValue == product.ProductNumber)) 
       select custmer; 

      foreach (var filterCustmer in filteredCustomers.Distinct()) 
      { 
       Console.WriteLine(filterCustmer.FirstName); 
      } 
+0

Si può dare il nome della proprietà come stringa instated di nameof e il problema è la classe del cliente. Questa classe contiene un elenco di prodotti che significa che devi mapparli con un ideogramma, ma nella tua classe non c'è nulla che tu possa mappare con esso. –