繁体   English   中英

C#在LINQ GroupBy语句中使用字符串获取动态属性

[英]C# Using Strings in LINQ GroupBy Statement for Dynamic Properties

环境:ASP.net Core 2 Web API项目。

我有一个查询,查询一个数据库并返回具有许多属性的模型的查询。 一些属性对于每个记录都是唯一的(例如,名称),而其他属性则与多个记录(例如,类别,类型等)相关。

最终,我需要计算返回的类别的摘要以及每个类别的记录计数。 通常,我会执行此SQL,但在这种情况下我不能这样做。

我知道可以使用LINQ做到这一点:

例如:

var results = GetSearch(....); //Thing that gets all the results from the database.

var catSummary = results.GroupBy(c => c.Category).ToList();

很棒,但是我要做大约6个。 所以我想:我将列出一个清单:

List<string> FilterableAttributes = new List<string>
    {
            "Category",
            "Type",
            "Town"
    }; 

然后像这样循环遍历模型:

SearchResults searchresults = new SearchResults(); //This is the Model used in the results.
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(searchresults))
{
    var match = FilterableAttributes.FirstOrDefault(stringToCheck => stringToCheck.Contains(prop.Name));
    if (match != null)
    {
        var summary = results.GroupBy(c => c.XXXXXXX).ToList(); //Here is where I'm stuck.
    }
}

哪个应该工作,我只是不知道如何将属性从模型传递到GroupBy语句。 我知道我可以通过'prop.Name'获得该属性的名称,但是我似乎无法弄清楚如何使用它。

我也尝试过这种方式:

var summary = from r in results 
              group r by r.XXXXXX into g //Unknown how to make this work
              select new { Name = g.Key, Count = g.Count() };

(这可能是我应该采取的方法,因为这会使下一部分变得更容易)。

这部分代码可能是API中最需要的部分,因此速度很重要。 (我一直在阅读反射的速度如何)

C#对我来说是新手,我的背景是Python。

有想法,意见,想法吗? 我意识到我可能会犯错,因此,我提供了一些我想要总体实现的细节,而不仅仅是技术问题。

如果变量“结果”是用户定义的类型,则可以对以下对象使用Linq。

var summary = results.GroupBy(c => c.GetType().GetProperty(category).GetValue(c, null))

如果它是数据库对象,则可以通过简单的if-else条件(如下所示)来实现。

SearchResults searchresults = new SearchResults(); 
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(searchresults))
{
    var match = FilterableAttributes.FirstOrDefault(stringToCheck => stringToCheck.Contains(prop.Name));
    if (match != null)
    {
        var summary = new List(); 
        if(prop.Name == "prop1") // Place prop1 in a static constants variable
          {
        summary = results.GroupBy(c => c.yourProperty1).ToList(); 
          }
        else if(prop.Name == "prop2")
          {
              // go on
          }
    }
}

暂无
暂无

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

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