相关疑难解决方法(0)

如何将多个表达式传递给OrderBy for EF?

我使用的是EF 4.2,但我希望这也适用于EF 4和4.1.

我想通过一个IQueryable<T>和多个Expression<Func<TSource, TKey>>的方法和具有应用该方法OrderBy,并ThenByIQueryable<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

13
推荐指数
1
解决办法
5044
查看次数

如何检查ObjectQuery <T>表达式树中是否存在OrderBy

我正在使用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)

c# linq generics linq-to-entities code-generation

6
推荐指数
1
解决办法
6580
查看次数

LINQ多个订单

我创建了一个具有以下参数的函数:

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

还有其他建议吗?

c# linq .net-4.0 sql-order-by

4
推荐指数
1
解决办法
2762
查看次数