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

问题描述 投票:0回答:2

我有通用的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子句构建自定义表达式的原因。

c# entity-framework linq entity-framework-6 sql-order-by
2个回答
0
投票

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

.OrderBy( “COLUMNNAME”)


0
投票

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

var resultQuery = query
            .OrderBy(item => !string.IsNullOrEmpty(item.Path.Path))
            .ThenBy(item => item.FileName)
            .Select(selector);
© www.soinside.com 2019 - 2024. All rights reserved.