繁体   English   中英

Linq到集合-动态Where子句

[英]Linq to Collection - Dynamic Where Clause

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

示例对象

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}

如果用户决定对属性“ a”进行分组,我们将如何生成[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子句是“州=科罗拉多州”。 似乎查询正在应用该值,而不是属于该类型的属性状态。 就像在调用查询时将其反转一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM