我有一个IQueryable.我没有在它上面调用OrderBy或者用它做任何事情.
如果我做:
// for some reason, isItOrdered is always true
var isItOrdered = myQueryable is IOrderedQueryable<T>
Run Code Online (Sandbox Code Playgroud)
为什么这总是如此?(好像不应该这样.)更重要的是,如何判断IQueryable是否已被订购?(即真正的IOrderedQueryable)
我希望能够做到这样的事情:
if (myQueryable is IOrderedQueryable<T>)
myQueryable = myQueryable.ThenBy(...);
else
myQueryable = myQueryable.OrderBy(...);
Run Code Online (Sandbox Code Playgroud) 我正在使用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)