环境: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。
想法,评论,想法? 我意识到我可能会犯错,因此,我提供了一些我想总体上实现的目标的详细信息,而不仅仅是技术问题。
答案 0 :(得分:1)
如果变量“结果”是用户定义的类型,则可以对以下对象使用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
}
}
}