我想创建一个通用LINQ
函数来对数据库中select
的结果进行分组。但是,对于每个数据库表,我应该有一个不同的group by
。基本上,我想做的是按columnName1
和columnName2
对table1
的结果进行分组:
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 };
并按columnName3
对table2
的结果进行分组:
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>());