我正在尝试使用System.Linq.Dynamic.Core创建一个泛型方法。该方法如下所示:
protected virtual IQueryable<TEntity> GetQueryableDymanic<TEntity>(
string filter = null,
string orderBy = null,
string includeProperties = null,
int? skip = null,
int? take = null,
params object[] parameters)
where TEntity : class
{
includeProperties = includeProperties ?? string.Empty;
IQueryable<TEntity> query = context.Set<TEntity>();
if (filter != null)
{
query = query.Where(filter,parameters);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
query = query.OrderBy(orderBy);
}
if (skip.HasValue)
{
query = query.Skip(skip.Value);
}
if (take.HasValue)
{
query = query.Take(take.Value);
}
return query;
}
我想添加string SelectedColumns
参数,以便我还可以指定返回哪些列。 Null将返回所有列,并且提供逗号分隔的字符串将仅返回指定的列。所以我的方法可能看起来像这样:
if (SelectedColumns != null)
{
query = query.Select($"new({SelectedColumns})");
}
虽然.Select("new(CompanyName as Name, Phone)")
类似于普通旧动态linq查询的完全合法语法,但在这种情况下会抛出转换错误:
Cannot implicitly convert type 'System.Linq.IQueryable' to 'System.Linq.IQueryable<TEntity>'
因此即使我能够使用.Select()
来指定要返回的列,但似乎无法使用TEntity
来执行此操作。这根本不可能吗?我尝试使用DTO路线并创建一个具有较少属性的对象,但这会产生更多问题。
任何人都知道如何才能做到这一点?我已经浏览了网页,似乎有一些已发布的解决方案,用T而不是TEntity做这个。