c# - C# 在动态属性的 LINQ GroupBy 语句中使用字符串
问题描述
环境: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。
想法,评论,想法?我意识到我可能做错了,因此我提供了一些我想要实现的整体目标的细节,而不仅仅是技术问题。
解决方案
如果变量 'results' 是用户定义的类型,那么您可以使用 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
}
}
}
推荐阅读
- mysql - Node.js 防止在 setInterval 中堆叠异步函数
- visual-studio-code - Visual Studio 代码中是否有类似于“设置下一个语句”的内容?
- powershell - PowerShell 不会在另一台机器上运行批处理文件
- r - 使用 tidyr 将一列拆分为两列
- java - Jackson yaml 库无法解析有效的 yaml 文件
- ios - 如何在同一设备但不同帐户中执行ios IAP
- c++ - visual c++ /MANIFESTUAC 链接器选项不起作用
- pydev - Eclipse Photon 透视图的行为与 Eclipse Mars 不同(= 奇怪)
- javascript - 使用图像创建定时静音命令
- triggers - 有两个条件的触发器总是在一个条件为假时触发