簡體   English   中英

使用列表按LINQ分組

[英]Group by LINQ using a list

我想創建一個通用的LINQ函數來對數據庫中的select結果進行分組。 但是,對於每個數據庫表,我應該有一個不同的group by 基本上,我想做的是將table1的結果按columnName1columnName2分組:

from element in databaseRows
     group element by 
          new { column1 => element.Value("columnName1"), column2 => element.Value("columnName2")}
          into g
          select new { key = g.Key, value = g };

並將table2的結果按columnName3分組:

from element in databaseRows
     group element by 
          new { column1 => element.Value("columnName3")}
          into g
          select new { key = g.Key, value = g };

我想創建一個通用函數,以接收必須對其進行分組的列列表,如下所示:

from element in databaseRows
     group element by 
          new { 
               foreach (var v in columnsList)
                      element.Value(v);
          }
          into g
          select new { key = g.Key, value = g };

我知道我不能以這種方式做,但是還有另一種方式可以做嗎?

從您擁有的項目到對象數組中創建投影非常簡單,其中該數組代表給定列名稱集合的值:

public static Func<DbResult, string[]> GetProperties(IEnumerable<string> propertyNames)
{
    return item => propertyNames.Select(name => item.Value(name))
        .ToArray();
}

然后問題是如何對字符串值數組進行分組,因為默認的相等比較器將比較引用而不是值。 下面的比較器將能夠基於序列中的值而不是序列的標識來比較值序列是否相等:

public class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>>
{
    private IEqualityComparer<T> comparer;
    public SequenceComparer(IEqualityComparer<T> comparer = null)
    {
        comparer = comparer ?? EqualityComparer<T>.Default;
    }
    public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
    {
        return x.SequenceEqual(y, comparer);
    }

    public int GetHashCode(IEnumerable<T> sequence)
    {
        unchecked
        {
            int hash = 19;
            foreach (var item in sequence)
                hash = hash * 79 + comparer.GetHashCode(item);
            return hash;
        }
    }
}

現在我們可以寫:

var query = databaseRows.GroupBy(GetProperties(columnsList), 
    new SequenceComparer<string>());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM