我想用特定对象的公共属性填充下拉列表,我做得很好。但是现在,当用户从下拉列表中选择值时,我希望它按该列对数据库表结果进行分组。我尝试过使用 LINQ,但只能弄清楚如何按实例变量属性(而不是反射属性)显式分组。这是我的方法 - 传入的参数是属性的字符串名称。例如,如果用户想按 Customer.Country 分组,则为“Country”;如果用户想按 Customer.State 分组,则为“State”。但目前我已硬编码为按“状态”分组,因为我无法弄清楚如何使用通过 LINQ 查询传入的字符串值
private void DisplayReportAction(string category)
{
if (!string.IsNullOrEmpty(category))
{
SelectedCategory = category;
_summaries.Clear();
foreach (var custGroup in _customerInterface.CustomerInterface.GetAllCustomers().GroupBy(c => c.State)
.Select(group => new
{
Category = group.Key,
Count = group.Count()
})
.OrderBy(x => x.Category))
{
_summaries.Add(new CustomerReportSummaryViewModel(custGroup.Category, custGroup.Count));
}
ReportVisibility = Visibility.Visible;
}
}
如果您使用 LINQ to Objects,则可以使用反射,例如您可以使用这个:
_customerInterface.CustomerInterface.GetAllCustomers()
.GroupBy(c => c.GetType().GetProperty(category).GetValue(c, null))
如果您使用 Linq To Sql,则另一种方法是使用动态查询,请检查此链接
您可以动态构建表达式:
Expression<Func<Customer,T>> buildExpression<T>(string category)
{
//First build parameter of lambda ( 'c =>' part of expression)
ParameterExpression param = Expression.Parameter(typeof(Customer), "c");
//Then body of expression : ' => c.category'
Expression<Func<Customer, T>> exp = Expression.Lambda<Func<Customer, T>>(Expression.Property(param, category), param);
return exp;
}
最后,请致电
_customerInterface.CustomerInterface.GetAllCustomers()
.GroupBy(buildExpression(category))
编辑: 好吧,抱歉,您仍然需要知道属性的类型才能将 T 类型参数赋予
buildExpression
函数
有多种方法可以做到这一点,例如使用
GetProperty(category).PropertyType
,然后在 MakeGenericMethod
上调用 GetType().GetMethod("buildExpression<>")
,但这需要更多的工作。
不管怎样,你必须找到一种方法来从这种类型构建 CustomerReportSummaryViewModel
。
我不知道你的用例,但你可能所有类别属性都属于同一类型,所以你可以对其进行硬编码?
如果您有兴趣,并且找不到合适的方法,请告诉我,我会尝试编写合适的解决方案。
如果组的类别计数是动态的,您可以执行以下操作:
List<string> categories = new List<string>{ctegory_1,category_2...}
var grouped =_customerInterface.CustomerInterface.GetAllCustomers().GroupBy($"new({string.Join(",", categories)})", "group");
List<List<Customers>> customers = new List<List<Customers>>();
foreach (var item in grouped)
{
var list = (item as Ienumerable<Customer>).ToList();
customers.add(list);
}