其他分享
首页 > 其他分享> > 使用字符串字段名称动态构建具有层次结构的linq查询?

使用字符串字段名称动态构建具有层次结构的linq查询?

作者:互联网

我很困惑.我需要获取一个简单的对象列表,将几个字段名称数组作为字符串(在其中进行分组,对其进行排序以及对其进行选择)在运行时提供,并以某种方式生成LINQ查询以返回用于JSON序列化的对象.

我在安装程序的下面构建了一个示例repro. OrderBy非常简单,我只使用GetType().GetProperty()查找正确的属性,然后将orderby字段迭代到菊花链.OrderBy调用.所有这些都落在GroupBy上,因为每个都将结果包装在IEnumerable>中.

有什么好方法吗?我在网上找到的所有内容都使人们诉诸于良好的旧递归程序代码. LINQ必须有办法做到这一点,但我迷路了.我尝试的所有内容都无法编译,类型也无法匹配.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Linq.Dynamic;

namespace linqtest2
{
    class Program
    {
        static void Main(string[] args)
        {
            var products = new List<Product>
                {
                    new Product("Food", "Fruit", "Apple"),
                    new Product("Food", "Fruit", "Banana"),
                    new Product("Food", "Fruit", "Orange"),
                    new Product("Food", "Vegetables", "Carrot"),
                    new Product("Food", "Vegetables", "Pea"),
                    new Product("Drink", "Soft Drink", "Orange Juice"),
                    new Product("Drink", "Soft Drink", "Lemonade"),
                    new Product("Drink", "Alcoholic", "Bitter"),
                    new Product("Drink", "Alcoholic", "Lager"),
                    new Product("Drink", "Alcoholic", "Vodka")
                };

            string[] select = new[] { "Category", "Name" };
            string[] orderBy = new[] { "Name", "Category" };
            string[] groupBy = new[] { "Category", "Subcategory" };
        }
    }

    public class Product
    {
        public string Name { get; set; }
        public string Category { get; set; }
        public string Subcategory { get; set; }

        public Product(string category, string subcategory, string name)
        {
            Category = category;
            Subcategory = subcategory;
            Name = name;
        }
    }
}

解决方法:

请检查Dynamic Linq库,该库提供了一种使用字符串而不是lambda的方法.

使用动态linq,您可以编写:

products.OrderBy("Category").ThenBy("Name")

还有很多其他可能性.

编辑:

更新解决方案使其更具动态性.

IQueryable<Product> query = products;
bool firstOrderBy = true;
foreach(var orderExpression in orderBy)
{
    if (firstOrderBy)
    {
        query = query.OrderBy(orderExpression);
        firstOrderBy = false;
    }
    else
    {
        query = query.ThenBy(orderExpression);
    }
}

正如我建议的那样,请验证库,对其进行探索并使其适应您的需求.您也可以使用GroupBy和Select.

还要检查@dkackman提出的解决方案,看看哪种解决方案更适合您的需求,您需要做一些工作来适应您的需求.

标签:linq-to-objects,linq,c
来源: https://codeday.me/bug/20191029/1960925.html