Linq to Collection - Dynamic Where Clause

时间:2017-01-20 21:45:16

标签: c# wpf linq

我有一个WPF应用程序,我想填充树视图。在此之前,我希望用户能够从下拉列表中选择集合中可用的任何字段/属性,然后使用数据填充树并进行适当分组。

示例对象

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

同样,下拉列表将与列表中可用的属性绑定。这样,如果更改应用程序的列表不需要修改。这是我需要的答案的一个重要要求。

让我们说用户选择&#34; Property_A&#34;。

我想要一个看起来像这样的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}

如果用户决定对财产进行分组&#34; a&#34;我们如何制作[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;
        }

异常 &#34;没有财产或领域&#34;科罗拉多&#34;存在于WVWellModel&#34;

类型中

在这个例子的情况下,我可以确认我的where子句是&#34; State = Colorado&#34;。看起来查询正在应用值而不是属性状态,该属性是该类型的一部分。就好像在调用查询时它是相反的。

1 个答案:

答案 0 :(得分:2)