2017-01-20 24 views
0

我有一个WPF应用程序,我想填充一个treeview。在这种情况发生之前,我希望用户能够从下拉列表中选择集合中可用的任何字段/属性,然后使用数据填充树并进行适当分组。Linq to Collection - Dynamic Where子句

例子中的物体

public class class_01{ 
    public string Property_A {get; set;} 
    public string Property_B {get; set;} 
    public string Property_C {get; set;} 
} 

的例子合集

List<class_01> list_01 = new List<class_01>(); 

再次下拉将用什么都属性都可以从列表中的约束。这样如果列表在哪里改变应用程序将不需要修改。这是我需要的答案的重要要求。

可以说用户选择“Property_A”。

我想要一个像这样的linq查询方法。

LINQ查询

public groupingModel getGrouping(string groupBy) // groupby equals property A in this example 
    { 

     List<class_01> list = getList(); //Returns the list of data of type class_01 

     var q = from x in w where ????? == groupBy select x; // I dont want to specify a specific property but rather have one applied dynamically 

     return q; 
    } 

我有一个查询将被解析成自定义对象。这看起来类似于以下内容。

自定义对象

public class class_02{ 
    public string header {get; set;} // will be set to the discrete values of the selected groupby property 
    public List<class_01> prop_a {get; set;} 
} 

这将被绑定到树适当。

有什么想法?

编辑

此外,我将如何得到用户选择属性的唯一值的列表。

例如

{A = 1,B = 2,C = 3},{A = 2,B = 3,C = 4}

如果用户决定基上属性“一个“我们将如何产生[1,2]的集合?

这将需要构造一个where子句。

foreach(value of user selected property){ 
    string whereClause = string.format("{0} = {1}",selected property, value") 
} 

编辑 - 从动态查询捕捉异常

public List<groupingModel> getGrouping(string groupBy) 
     { 
      List<groupingModel> lgm = new List<groupingModel>(); 

      //Categories.Select(c => c.Id).ToList() 
      var w2 = getWVWellsList(); 
      //var v = w2.Select(groupBy).Distinct().Cast<string>().ToArray(); 
      var v = w2.Select(groupBy).Distinct(); 

      foreach(string val in v) 
      { 

       string whereClause = string.Format("{0} = {1}", groupBy, val); 

       try 
       { 

        IEnumerable<WVWellModel> q2 = w2.Where(whereClause); 
        List<WVWellModel> l = q2.ToList<WVWellModel>(); 

        lgm.Add(new groupingModel { Header = val, Wells = l }); 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show(e.Message, "Query Error", MessageBoxButton.OK, MessageBoxImage.Error); 
        throw new Exception("Generic Exception - Issue With Group By Query", e); 
       } 

      } 

      return lgm; 
     } 

异常 “否属性或字段 ”科罗拉多“ 存在于型WVWellModel”

在本例的情况下我可以证实我的where子句是“State = Colorado”。看起来查询正在应用该值,而不是属于该类型的属性状态。它就好像在查询被调用时被颠倒过来一样。

回答

2
+0

阿哈的帖子!这非常方便。你会如何建议我为动态查询生成一个可能的值列表?或者有没有办法在图书馆处理?我编辑了我的问题以包含该步骤。感谢您输入@Tito。 – LCaraway

+0

我编辑了我的问题以使用动态Linq查询。我建立一个字符串where子句,虽然我面临一些问题。抛出异常,指示正在应用错误的字符串属性。 – LCaraway