Ожидаемое выражение типа «T» при использовании Dynamic Linq

Я использую библиотеку Dynamic Linq в своем приложении .NET MVC для запроса базы данных SQL Server. Пока все работает нормально.

Мне нужно сделать динамический выбор, но всегда возвращать ожидаемое выражение типа 'T':

public static IQueryable<T> SelectByFields<T>(this IQueryable<T> q, string expression, params object[] values) // IEnumerable<string> fieldNames)
{
    try
    {
        var param = Expression.Parameter(typeof(T), "p");
        var lambda = System.Linq.Dynamic.DynamicExpression.ParseLambda(new ParameterExpression[] { param }, typeof(T), expression, values);

        Type[] types = new Type[] { q.ElementType, lambda.Body.Type };
        return q.Provider.CreateQuery<T>(Expression.Call(typeof(Queryable), "Select", types, q.Expression, Expression.Quote(lambda)));
    }
    catch
    {
        return q;
    }

person Juan Antonio Mañas    schedule 16.01.2015    source источник
comment
Судя по всему, вам нужно 2 общих параметра. От T (вход) до U (выход). В противном случае единственными доступными для выбора полями будут поля того же типа контейнера.   -  person leppie    schedule 16.01.2015
comment
Я исследовал это 'var lambda = System.Linq.Dynamic.DynamicExpression.ParseLambda(typeof(T), typeof(object), expression, values); Type[] types = new Type[] { q.ElementType, lambda.Body.Type }; return q.Provider.CreateQuery‹T›(Expression.Call(typeof(Queryable), Select, types, q.Expression, Expression.Quote(лямбда)));' но не возвращать приведение Нет возможности преобразовать тип объекта 'System.Data.Entity.Infrastructure.DbQuery1[System.Object]' al tipo 'System.Linq.IQueryable1[AccesoDatosEF.Sujetos.CLIENTE]'. Я думаю, что ошибка заключается в выражении   -  person Juan Antonio Mañas    schedule 16.01.2015
comment
Разве у вас не должно быть typeof(Queryable<T>) ?   -  person leppie    schedule 16.01.2015
comment
Пожалуйста, не добавляйте ответ в вопрос. Вместо этого опубликуйте ответ.   -  person Patrick Hofman    schedule 16.01.2015
comment
Я решил. Большое спасибо!!   -  person Juan Antonio Mañas    schedule 16.01.2015


Ответы (1)


Наконец я решаю проблему

public static IQueryable SelectByFields(this IQueryable q, string expression, params object[] values) // IEnumerable<string> fieldNames)
    {
        try
        {
            if (q == null)
                throw new ArgumentNullException("source");

            if (expression == null) 
                throw new ArgumentNullException("selector");

            LambdaExpression lambda = System.Linq.Dynamic.DynamicExpression.ParseLambda(q.ElementType, null, expression, values);
            Type[] types = new Type[] { q.ElementType, lambda.Body.Type };

            return q.Provider.CreateQuery(Expression.Call(typeof(Queryable), "Select", types, q.Expression, Expression.Quote(lambda)));
        }
        catch
        {
            return q;
        }
    }

И вызов метода

var aux = context.CLIENTES.SelectByFields("new (ID)") as IQueryable<Object>;
person Juan Antonio Mañas    schedule 19.01.2015