Linq按参数查询

时间:2016-03-09 11:22:41

标签: c# database linq nhibernate group-by

我正在尝试使用NHibernate和Linq实现一种新的查询方法。方法是:

public object Query(Expression<Func<T, bool>> whereExpression, Expression<Func<T, object>> groupExpressionKeySelector, Expression<Func<object, IEnumerable<T>, object>> resultSelector)
{
        var results = Session.Query<T>().Where(whereExpression).GroupBy(groupExpressionKeySelector, resultSelector).ToList();
        return results;
}

电话就像:

    Expression<Func<Serial, bool>> whereExpression = serial => serial.Status == Status.Ok;
Expression<Func<Serial, object>> groupExpressionKeySelector = serial => serial.Type.Code;
Expression<Func<object, IEnumerable<Serial>, object>> groupExpressionResultSelector = (key, q) => new { Id = key, Quantity = q.Count() };

var results = this.SerialRepository.Query(whereExpression, groupExpressionKeySelector, groupExpressionResultSelector);

问题是句子引发了异常System.Reflection.TargetInvocationException':

{“Ningúnmétodogenérico'GroupBy'parael tipo'System.Linq.Enumerable'es compatible con los argumentos normales y de tipo proporcionados。no se deben proporcionar argumentos de tipo sielmétodonoesgenérico。”}

似乎没有期待打字参数......你知道发生了什么吗?没有参数resultSelector一切正常..

1 个答案:

答案 0 :(得分:0)

正如my comment所述,我怀疑你的案例有一个好的设计。

无论如何,我怀疑问题是object键入键太宽,需要更具体。也许您当前的输入会阻止编译器选择正确的GroupBy重载。为您的方法添加更多通用参数。

public object Query<TKey>(Expression<Func<T, bool>> whereExpression,
    Expression<Func<T, TKey>> groupExpressionKeySelector,
    Expression<Func<TKey, IEnumerable<T>, object>> resultSelector)
{
        var results = Session.Query<T>()
            .Where(whereExpression)
            .GroupBy(groupExpressionKeySelector, resultSelector)
            .ToList();
        return results;
}

然后,假设serial.Type.Codestring

Expression<Func<Serial, bool>> whereExpression =
    serial => serial.Status == Status.Ok;
Expression<Func<Serial, string>> groupExpressionKeySelector =
    serial => serial.Type.Code;
Expression<Func<string, IEnumerable<Serial>, object>> groupExpressionResultSelector = 
    (key, q) => new { Id = key, Quantity = q.Count() };

var results = this.SerialRepository.Query(whereExpression,
    groupExpressionKeySelector, groupExpressionResultSelector);

但这可能还不够。您可能需要完全通用。由于匿名输入,它需要直接提供resultSelector

public List<TResult> Query<TKey, TResult>(Expression<Func<T, bool>> whereExpression,
    Expression<Func<T, TKey>> groupExpressionKeySelector,
    Expression<Func<TKey, IEnumerable<T>, TResult>> resultSelector)
{
        var results = Session.Query<T>()
            .Where(whereExpression)
            .GroupBy(groupExpressionKeySelector, resultSelector)
            .ToList();
        return results;
}

然后,仍假设serial.Type.Codestring

Expression<Func<Serial, bool>> whereExpression =
    serial => serial.Status == Status.Ok;
Expression<Func<Serial, string>> groupExpressionKeySelector =
    serial => serial.Type.Code;

var results = this.SerialRepository.Query(whereExpression,
    groupExpressionKeySelector, 
    (key, q) => new { Id = key, Quantity = q.Count() });