使用 Dynamic Linq 时预期 'T' 类型的表达式
Expression of type 'T' expected when using Dynamic Linq
我在 .NET MVC 应用程序中使用动态 Linq 库来查询 SQL 服务器数据库。目前一切正常。
我需要创建一个动态 select 但总是 return '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;
}
我终于解决了问题
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>;
我在 .NET MVC 应用程序中使用动态 Linq 库来查询 SQL 服务器数据库。目前一切正常。
我需要创建一个动态 select 但总是 return '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;
}
我终于解决了问题
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>;