如何使用System.Linq.Dynamic.Core将“Select”传递给通用查询?

时间:2017-11-17 23:56:36

标签: c# linq entity-framework-core

我正在尝试使用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做这个。

0 个答案:

没有答案