如何查询列名与字符串的比较

本文关键字:字符串 比较 何查询 查询 | 更新日期: 2023-09-27 18:28:33

我想根据列名对列进行排序,列名是一个字符串,但不幸的是,我无法实现这一点,因为OrderByDescending比较了其他内容,但我正在发送一个字符串。

public List<DOlead> sortLead(DOuser user, string Item)
    {
        List<DOlead> ObjLead = new List<DOlead>();
        ObjLead = _Context.leads.Where(x => x.is_converted == false).OrderByDescending(Item).ToList();
        return ObjLead;
    }

请帮帮我?

如何查询列名与字符串的比较

使用反射

public List<DOlead> sortLead(DOuser user, string Item)
{    
    var propertyInfo = typeof(DOlead).GetProperty(Item);    
    List<DOlead> ObjLead = new List<DOlead>();
    ObjLead = _Context.leads.Where(x => x.is_converted == false).OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList();
    return ObjLead;
}

编辑在得到SO的评论后,经过一些研究,我发现了这个答案,并决定为用户修改它。

您必须先创建lambda表达式,然后将其传递给order by子句。

正在创建lambda表达式。

public static class QueryableHelper
{
    public static IQueryable<TModel> OrderBy<TModel>(this IQueryable<TModel> q, string name)
    {
        Type entityType = typeof(TModel);
        PropertyInfo p = entityType.GetProperty(name);
        MethodInfo m = typeof(QueryableHelper).GetMethod("OrderByProperty").MakeGenericMethod(entityType, p.PropertyType);
        return(IQueryable<TModel>) m.Invoke(null, new object[] { q, p });
    }
    public static IQueryable<TModel> OrderByDescending<TModel>(this IQueryable<TModel> q, string name)
    {
        Type entityType = typeof(TModel);
        PropertyInfo p = entityType.GetProperty(name);
        MethodInfo m = typeof(QueryableHelper).GetMethod("OrderByPropertyDescending").MakeGenericMethod(entityType, p.PropertyType);
        return (IQueryable<TModel>)m.Invoke(null, new object[] { q, p });
    }
    public static IQueryable<TModel> OrderByPropertyDescending<TModel, TRet>(IQueryable<TModel> q, PropertyInfo p)
    {
        ParameterExpression pe = Expression.Parameter(typeof(TModel));
        Expression se = Expression.Convert(Expression.Property(pe, p), typeof(object));
        return q.OrderByDescending(Expression.Lambda<Func<TModel, TRet>>(se, pe));
    }
    public static IQueryable<TModel> OrderByProperty<TModel, TRet>(IQueryable<TModel> q, PropertyInfo p)
    {
        ParameterExpression pe = Expression.Parameter(typeof(TModel));
        Expression se = Expression.Convert(Expression.Property(pe, p), typeof(object));
        return q.OrderBy(Expression.Lambda<Func<TModel, TRet>>(se, pe));
    }
}

您修改的方法

public List<DOlead> sortLead(DOuser user, string Item)
    {      
        List<DOlead> ObjLead = new List<DOlead>();
        ObjLead = _Context.leads.Where(x => x.is_converted == false).OrderByDescending(Item).ToList();
        return ObjLead;
    }

从堆栈,我想你可以使用反射:

from x in db.TableName
    where (x.GetType().GetProperty(stringCOLUMN_1_or2).GetValue(x, null)) == " 8"
select x;

但不确定有什么简单的林奇什方法可以做到这一点

Assuming dynamic Linq will work it would just be:

from x in objets
.Where(stringCOLUMN_1_or2  + " = ' " + 8 + "'")
select x

这里有一些关于SQL动态Linq的更多信息:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

您应该使用表达式生成器来实现这个简单的字符串属性示例:

public class OrderByData
    {
        public string PropertyName { get; set; }
    }
    public static class ExpressionBuilder
    {
        public static Expression<Func<T, string>> GetExpression<T>(OrderByData filter)
        {
            ParameterExpression param = Expression.Parameter(typeof(T), "t");
            Expression exp = GetExpression<T>(param, filter);
            return Expression.Lambda<Func<T, string>>(exp, param);
        }
        private static Expression GetExpression<T>(ParameterExpression param, OrderByData filter)
        {
            MemberExpression member = Expression.Property(param, filter.PropertyName);
            return member;
        }
    }

然后这样调用:

    public List<DOlead> sortLead(DOuser user, string Item)
        {
            List<DOlead> ObjLead = new List<DOlead>();
 new OrderByData { PropertyName = Item };
            var deleg = ExpressionBuilder.GetExpression<lead>(filter).Compile();
            ObjLead = _Context.leads.Where(x => x.is_converted == false).OrderByDescending(deleg).ToList();
            return ObjLead;
        }

您还可以扩展到使用其他类型,而不仅仅是字符串。