在EF中构建自定义OrderBy表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在EF中构建自定义OrderBy表达式相关的知识,希望对你有一定的参考价值。

我有通用的EntityFramework类,它与数据库上下文一起使用。此类用于从任何表中获取数据。

public async Task<List<TResult>> GetAsync<T, TResult>(
            Expression<Func<T, TResult>> selector,
            Expression<Func<T, bool>> predicate = null,
            IEnumerable<string> paths = null
            )
            where T : class, IEntityWithName<int>
        {
            var query = Entities<T>();

            if (predicate != null)
                query = query.Where(predicate);

            if (paths != null)
                foreach (var path in paths)
                    query = query.Include(path);

            var resultQuery = query
                .OrderBy(iten => item.Path.Path) // <- I need this part to work. 
                .ThenBy(item => item.FileName)  // Sort by Path first, then by FileName
                .Select(selector);

                var items = await resultQuery.ToListAsync();

                return items;
            }
        }

File table
   ID filename PathID
   1  dog1.jpg  1 
   2  dog2.jpg  2

Path table
   ID Path             
   1  \folderPath1           
   2  \folderPath2          

我的问题是如何提供OrderBy参数,以便结果按Path排序,当然存储在Path表中。

我面临的问题是“Path”实体不会始终包含在结果中。这就是我首先需要检查,然后为OrderBy子句构建自定义表达式的原因。

答案

您可以使用LINQ动态查询库,它允许orderby,where子句和其他操作中的字符串参数。

.OrderBy( “COLUMNNAME”)

另一答案

您可以检查OrderBy()子句以检查item.Path.Path是否为nullOrEmpty:

var resultQuery = query
            .OrderBy(item => !string.IsNullOrEmpty(item.Path.Path))
            .ThenBy(item => item.FileName)
            .Select(selector);

以上是关于在EF中构建自定义OrderBy表达式的主要内容,如果未能解决你的问题,请参考以下文章

通过字符串生成 EF orderby 表达式

我可以重用代码来为 EF Core 的子属性选择自定义 DTO 对象吗?

基于子实体的属性构建 OrderBy Lambda 表达式

约束急切负载的自定义 orderBy()?

如何在 Toad for Oracle 中使用自定义代码片段?

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用