我使用的是EF 4.2,但我希望这也适用于EF 4和4.1.
我想通过一个IQueryable<T>和多个Expression<Func<TSource, TKey>>的方法和具有应用该方法OrderBy,并ThenBy在IQueryable<T>适当的.
我找到了这个答案,并根据以下内容编写了以下方法:
public IQueryable<User> ApplyOrderBy(IQueryable<User> query, IEnumerable<Expression<Func<User, IComparable>>> orderBy)
{
if (orderBy == null)
{
return query;
}
IOrderedQueryable<User> output = null;
foreach(var expression in orderBy)
{
if (output == null)
{
output = query.OrderBy(expression);
}
else
{
output = output.ThenBy(expression);
}
}
return output ?? query;
}
Run Code Online (Sandbox Code Playgroud)
只要我订购的属性是strings,这样就可以正常工作,但是当我尝试按int属性排序时,我得到一个例外:
无法将类型'System.Int32'强制转换为'System.IComparable'类型.LINQ to Entities仅支持转换实体数据模型基元类型.
有任何建议可以解决这个问题,或者采取不同的方法吗?我考虑过传入IEnumerable<Expression>,但后来需要弄清楚如何回转到特定类型(例如Expression<Func<User, int>)来调用OrderBy.
c# linq linq-to-entities entity-framework-4 entity-framework-4.1
我正在使用T4为LINQ to Entities实体生成存储库.
存储库包含(除其他外)适合于分页的List方法.支持和不支持的方法的文档没有提到它,但是你不能Skip在无序上"调用" IQueryable.它会引发以下异常:
System.NotSupportedException:方法'Skip'仅支持LINQ to Entities中的排序输入.必须在方法'Skip'之前调用'OrderBy'方法.
我通过允许通过部分方法定义默认排序来解决它.但是我在检查表达式树是否确实包含一个问题时遇到了问题OrderBy.
我已将问题减少到尽可能少的代码:
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery);
public IQueryable<Category> List(int startIndex, int count)
{
IQueryable<Category> query = List();
ProvideDefaultSorting(ref query);
if (!IsSorted(query))
{
query = query.OrderBy(c => c.CategoryID);
}
return query.Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression, int startIndex, int count)
{
return List(sortExpression).Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression)
{
return AddSortingToTheExpressionTree(List(), sortExpression);
}
public IQueryable<Category> List()
{
NorthwindEntities ent = …Run Code Online (Sandbox Code Playgroud) 我创建了一个具有以下参数的函数:
List<Expression<Func<CatalogProduct, bool>>> orderBy = null
Run Code Online (Sandbox Code Playgroud)
这个参数是可选的,如果它被填充,它应该为我创建一个order by,而不是为我创建一个order,这样我就可以在SQL server上订购结果.
我试过了:
IOrderedQueryable temp = null;
foreach (Expression<Func<CatalogProduct, bool>> func in orderBy)
{
if (temp == null)
{
temp = catalogProducts.OrderBy(func);
}
else
{
temp = temp.ThanBy(func);
}
}
Run Code Online (Sandbox Code Playgroud)
但是比没有重新定义.有人知道我怎么能解决这个问题吗?
我将其更改为.ThenBy()但是只允许直接在.OrderBy()之后,而不是在IOrderedQueryable上
so temp = catalogProducts.OrderBy(func).ThenBy(func); 允许但是temp = catalogProducts.OrderBy(func); temp = temp.ThenBy(func); issn't
还有其他建议吗?