动态Linq在GroupBy之后首先在组中选择

时间:2015-05-29 18:39:41

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

我想我已经阅读了关于这个主题的每一篇文章,但似乎仍无法让这一点发挥作用。 我想用动态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 

2 个答案:

答案 0 :(得分:3)

我通过添加到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)");

答案 1 :(得分:-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];