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

时间:2018-11-20 15:36:41

标签: c# entity-framework linq entity-framework-6 sql-order-by

我有通用的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”实体并不总是包含在结果中。这就是为什么我需要先检查,然后为OrderBy子句构建自定义表达式的原因。

2 个答案:

答案 0 :(得分:0)

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

.OrderBy(“列名”)

答案 1 :(得分:0)

您可以在OrderBy()子句中添加一个检查项,以检查item.Path.Path是否为NullOrEmpty:

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