【问题标题】:Entity Framework user defined query condition实体框架用户定义查询条件
【发布时间】:2021-07-20 02:01:43
【问题描述】:

我有

var query = from c in db.customers_info
                            group c by c.issue_date into g
                            select new
                            {
                                name = g.Key,
                                value = g.Count()
                            };

除了按 c.issue_date 分组外,还有其他字段,例如“c.gender”、“c.termination_date”、“c.customer_name”和许多字段。我想创建一个控制台应用程序,用户可以在其中输入他想要分组的字符串,并且查询会选择它。类似的东西

var query = from c in db.customers_info
                            group c by c.{user_input} into g
                            select new
                            {
                                name = g.Key,
                                value = g.Count()
                            };

到目前为止我的次优解决方案:

var query = from c in db.customers_info
                            group c by user_input.Equals("issue_date")? c.issue_date : user_input.Equals("gender")? c.gender : ... and more conditions.
                            into g
                            select new
                            {
                                name = g.Key,
                                value = g.Count()
                            };

有可能吗?

编辑:更愿意将 groupby 作为生成的 SQL 查询的一部分进行处理,而不是将所有字段带入应用程序,并将 groupby 放在应用程序级别。谢谢!

【问题讨论】:

  • 这能回答你的问题吗? LINQ Grouping dynamically
  • 嘿,@gunr2171 感谢 cmets。看起来他们的解决方案将“groupBy”带入了应用程序级别。我希望在数据库中完成“GroupBy”。
  • Linq 将把 Group By 条件作为它生成的 SQL 查询中的一个子句来实现。这就是您所说的“在数据库中完成'GroupBy'”的意思吗?您可以使用 dbContext 的 Database.Log 属性来检查 Linq 生成的 SQL。
  • LINQ Grouping dynamically 中的答案之一建议使用 Dynamic Linq,dynamic-linq.net。我相信这会正确地动态生成查询,请参阅dynamic-linq.net/basic-query-operators#groupbyDynamic LINQ GroupBy 功能与正常的强类型 GroupBy 相同。 请参阅:How to use GroupBy using Dynamic LINQ
  • 如果您使用的是 .net 框架(而不是 .net 核心),请查看 DynamicQueryable

标签: c# sql asp.net entity-framework


【解决方案1】:

可能是这样的:

/*  
 *  Listing 1
 *  Do TRY this at home, this code IS meant to be compiled
 */

var keySelectors = new List<Expression<Func<Measurement, ReportResult>>>();

/* list of select keys and aggregates that resulting groups will be projected to */
var selectAggregate = new List<Expression<Func<IGrouping<ReportResult, Measurement>, ReportResult>>>();

if (groupByClient)
{
    /* if grouping by client is selected, then we will not only group by that key
     * but will also add it to the projection */
    keySelectors.Add(x => new ReportResult { Client = x.Client });
    selectAggregate.Add(x => new ReportResult { Client = x.Key.Client });
}

if (groupByUser)
{
    /* same as before, add it to key selectors and add it to the projection */
    keySelectors.Add(x => new ReportResult { FirstUsername = x.User.UserName });
    selectAggregate.Add(x => new ReportResult { FirstUsername = x.Key.FirstUsername });
}

if (groupByClient || groupByUser)
{
    /* if either of the grouping is selected, then add the following aggregator */
    selectAggregate.Add(x => new ReportResult { FirstReading = x.Sum(x => x.Reading) });
}

var result = _context.Measurement
    /* call the magic function */
    .GroupBy(LinqExpressionHelpers.CombineKeySelectors(keySelectors))
    /* call the magic function again in a different role */
    .Select(LinqExpressionHelpers.CombineKeySelectors(selectAggregate));

摘自这篇文章: https://jksware.net/posts/ef-core-linq-groupby-dynamic-key/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2013-01-22
    • 2020-03-27
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多