我在我的仓库这个泛型方法:LINQ中,Lambda表达式和排序依据
public T GetFirstOrDefault(Expression<Func<T, bool>> where, Expression<Func<T, object>> keySelector, bool ascending)
{
if (ascending)
{
return dbset.Where(where).OrderBy(keySelector).FirstOrDefault<T>();
}
else
{
return dbset.Where(where).OrderByDescending(keySelector).FirstOrDefault<T>();
}
}
而且我希望能够像这样使用,其中dateCreated会DateTime类型:
someRepository.GetFirstOrDefault(m => m.myprop == someValue, m => m.DateCreated, true);
像这样,其中ID为类型的诠释:
someRepository.GetFirstOrDefault(m => m.myprop == someValue, m => m.Id, true);
像这样,其中名称是字符串类型:
someRepository.GetFirstOrDefault(m => m.myprop == someValue, m => m.Name, true)
但是,它给了我,当我用它下面的错误:
无法转换类型“System.DateTime的”输入“System.Object的”。 LINQ to Entities仅支持投射实体数据模型基元类型。
之后做一些研究,我发现,也许我不得不使用Expression<Func<TSource, TKey>>
型或类似的东西的一个KeySelector,而这正是我越来越糊涂了。如果我宣布我的方法是这样的,我不知道在哪里TKEY的应该是未来:
public T GetFirstOrDefault(Expression<Func<T, bool>> where, Expression<Func<TSource, TKey>> keySelector, bool ascending) { }
我在正确的道路上?我的OrderBy子句应该如何声明?
哪些属性是DateTime类型? – 2012-02-16 16:14:15
你的方法名称有点混乱。你实际上在做一个Min/Max函数,但是重载另一种完全不同的方法的名字。我会小心的。 – 2012-02-16 16:20:59
@ArsenMkrt:我所有的模型都是从一个DateCreated属性类型为DateTime的基础模型派生而来的。 – 2012-02-16 17:59:29