【问题标题】:Dynamic Linq Select to a complex objectDynamic Linq Select 到一个复杂的对象
【发布时间】:2016-08-18 12:14:49
【问题描述】:

我有一个简单的 Linq 查询:

var retVal = readModel
    .GroupBy(x => x.Service)
    .Select(
        grp => new GroupView
        {
            GroupName = grp.Key,
            GroupItems = grp.Sum(k => k.NumberOfItems)
        }
    );

retValIQueryable<GroupView>。到目前为止一切顺利,我想做的是使这个查询动态化,以便用户可以使用自定义分组策略。

这是我的第一次尝试:

var retVal = readModel
    .GroupBy("Service", "it")
    .Select("it.key");

这给了我一个包含组名的字符串数组。这很好,但是我想要达到的结果还很远,因为我有两个未回答的问题:

  • 如何将结果转换为 GroupView 模型
  • 我怎样才能赚到这笔钱?

【问题讨论】:

  • GroupName的类型是什么?一个字符串?你总是按这种类型的属性分组吗?例如字符串?
  • 是的,在这种情况下它是一个字符串,但它也可以是一个日期,但现在一个字符串就足够了。
  • 您为什么不使用您的第一个代码,而是将x => x.Service 替换为Expression<Func<Entity,string>> 类型的变量,其中Entity 是您的实体类型?

标签: c# linq dynamic-linq


【解决方案1】:

问题是 DynamicLinq 不允许这样做。

如果您想扩展 DynamicLinq 库以返回强类型结果,可以查看this answer

但如果你不想要它,这里有一个简单的解决方案:

//select your grouped results
var retVal = readModel
        .GroupBy("Service", "it")
        .Select("new (it.key as GroupName, Sum(it.NumberOfItems) as GroupItems)");

//Map them
var res = ((IEnumerable<dynamic>)retVal)
          .Select(x => new GroupView 
                 { 
                    GroupName = x.GroupName, 
                    GroupItems = x.GroupItems 
                 });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2021-12-08
    • 2014-06-10
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多