【问题标题】:Dynamic Linq select first in groups after GroupBy在 GroupBy 之后,动态 Linq 在组中首先选择
【发布时间】:2015-05-29 18:39:40
【问题描述】:

我想我已经阅读了关于这个主题的每一篇文章,但似乎仍然无法让它发挥作用。 我想用动态 Linq 复制以下 GroupBy。我试过这个Dynamic GroupBy,但似乎无法获得 First()。

var result = mydata
    .GroupBy(g => g.ID)
    .Select(z => z.First())
    .Select("new (ID, Field1, Field2)");

GroupBy 需要是动态的。我需要分组字段的第一行。 所以..

ID:1, Field1:W, Field2:L 
ID:1, Field1:A, Field2:B 
ID:2, Field1:A, Field2:B 
ID:2, Field1:C, Field2:D 

最终应该是:

ID:1, Field1:W, Field2:L 
ID:2, Field1:A, Field2:B 
OR
ID:1, Field1:A, Field2:B 
ID:2, Field1:C, Field2:D 

【问题讨论】:

  • 是的,哈哈..我需要 GroupBy 部分是动态的,所以我可以使用字符串而不是强类型“ID”。
  • 顺便说一句,我试过你提供的链接。但不能让它产生由我说我需要复制的查询创建的结果。
  • 是的,问题在于获取 First()

标签: c# linq linq-to-sql dynamic-linq


【解决方案1】:

我通过添加到 DynamicQueryable 解决了它

public static object First(this IQueryable source)
        {
            if (source == null) throw new ArgumentNullException("source");
            return source.Provider.Execute(
                Expression.Call(
                    typeof(Queryable), "First",
                    new Type[] { source.ElementType },
                    source.Expression));
        }

以上不是必需的。但为了保持一致性,还是添加了。

并添加到IEnumerableSignatures

void First()

查询变为:

var result = mydata
    .GroupBy("ID", "it")
    .Select("it.First()")
    .Select("new (ID, Field1, Field2)");

【讨论】:

    【解决方案2】:

    这个呢

                var mydata = new[] {
                    new { ID = 1, Field1 = "W", Field2 = "L"},
                    new { ID = 1, Field1 = "A", Field2 = "B"}, 
                    new { ID = 2, Field1 = "A", Field2 = "B"}, 
                    new { ID = 2, Field1 = "C", Field2 = "D"}
                }.ToList();
    
    
                var result = mydata.GroupBy(x => x.ID)
                    .Select(x => x.ToList()).ToList();​
    
                var output = result[0][0];
    
                var output1 = result[0];
                var output2 = result[1];
    

    【讨论】:

    • 这个问题专门针对dynamic-linq,它允许build string based query expressions,而不是关于基于标准表达式(委托)的LINQ。
    • 我创建了用于测试的样本数据。应该处理动态表达式。
    • 此代码不是动态 linq。动态 LINQ 处理字符串。不适用于表达式或委托。
    • 我不同意。使用 ToList() 使其成为动态表达式。我认为真正的问题是在 GroupBy 中使用 ToList() 是解决方案,然后 var output = result.FirstOrDefault() 给出正确的结果。
    • 你可以看看真正使用dynamic-linqanother answer。你读过tag info吗?无意冒犯,但您的建议并未使用 OP 要求的技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2010-09-28
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多