2016-05-26 14 views
5

Tôi có hai lớp:C# - Năng động, LINQ từ một danh sách điều kiện

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; } 
} 

Và một ví dụ:

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" 
      } 
     } 
    } 
}; 

tôi sử dụng System.Dynamic.Linq thư viện để lọc mảng của tôi:

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

Tôi tạo một lớp condition và một phiên bản:

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" 
    } 
}; 

Tôi muốn tạo ra nhiều khoản Where từ này List<Condition>

Làm thế nào để làm điều này?

+2

Bạn có thể hiển thị mã nơi bạn hiện đang áp dụng một điều kiện cho danh sách không? Nó phải đơn giản như 'var toFilter = sourceCollection.AsEnumerable(); foreach (điều kiện var trong điều kiện) {toFilter = toFilter.Where (điều kiện); } '. – CodeCaster

+0

Bạn có tất cả các loại proeprties typeof? –

+0

Không, tất cả các thuộc tính không phải là loại chuỗi –

Trả lời

1

Từ những gì tôi có thể thu thập nó chỉ là một trường hợp đơn giản để thực hiện điều này trong danh sách của bạn? Trừ khi tôi đang thiếu một cái gì đó?

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

Danh sách điều kiện của tôi xuất phát từ tệp cấu hình –

+0

Điều này có thể giúp bạn, http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library có thể tải xuống thư viện LINQ động với các mẫu cũng ở đây - http://msdn2.microsoft.com/en-us/vcsharp/bb894665.aspx – nik0lias

+0

Cũng với các mẫu được cung cấp bởi liên kết, bạn có thể tạo chuỗi để biểu diễn câu lệnh where - f. Ở đâu ("propertyName = @ 0 và propertyValue = @ 1", "SomeNameHere", "SomeOtherValue"); Vì vậy, bạn có thể xây dựng một chuỗi động. – nik0lias

0

Để giải quyết vấn đề của bạn tôi đã sửa đổi một chút lớp tình trạng của bạn như follwoing:

Một điều kiện cho một sức mạnh khách hàng có chứa một danh sách các điều kiện sản phẩm:

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

Để tạo ra nó :

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

bây giờ bạn có thể sử dụng truy vấn bên dưới để lọc khách hàng và t sản phẩm của anh ấy với điều kiện đã cho/s:

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

u có thể cung cấp cho tên thuộc tính như chuỗi instated của nameof và vấn đề là lớp khách hàng của bạn. Lớp này chứa danh sách các sản phẩm có nghĩa là bạn cần ánh xạ chúng với một ideintfier nhưng trong lớp bạn không có gì u có thể ánh xạ với nó. –

Các vấn đề liên quan