我正在尝试使用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一切正常..
答案 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.Code
是string
:
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.Code
是string
:
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() });