有没有办法动态选择运行哪个列?我不需要比较,只需动态选择列。
where SqlMethods.Like(s.GradeLevel, grade)
答案 0 :(得分:1)
您可以使用Expression动态构建查询。这是我写的一个例子,可以通过dymically选择colums来过滤。
private static Expression GetStringCompareExpression<TEntity>(Expression parameters, string method, FilterContainer filter, Type type)
{
Expression expression;
MemberExpression field = Expression.PropertyOrField(parameters, filter.field);
Expression constant = Expression.Constant(filter.value.ToLower().Trim(), type);
Expression lowercase = Expression.Call(field, "ToLower", null, null);
Expression trim = Expression.Call(lowercase, "Trim", null, null);
expression = AddNotNullExpression(field, Expression.Call(trim, method, null, constant));
return expression;
}
这个做了以下几点:
这是'AddNotNullExpression'方法:
private static Expression AddNotNullExpression(MemberExpression field, Expression expression)
{
if(field.Type.IsNullable())
{
// String mag niet null zijn
Expression nullConstant = Expression.Constant(null, field.Type);
Expression notNull = Expression.NotEqual(field, nullConstant);
expression = Expression.AndAlso(notNull, expression);
}
return expression;
}
这样称呼:
Expression expression = GetStringCompareExpression<TEntity>(parameters, "Contains", filter, propertyInfo.PropertyType);
最后返回IQueryable&lt;&gt;像这样:
public static IQueryable<TEntity> Where<TEntity>(this IQueryable<TEntity> query, FilterContainer filters)
{
Expression expression = GetSingleExpression<TEntity>(filters, parameters);
var lambda = Expression.Lambda<Func<TEntity, bool>>(expression, parameters);
return query.Where(lambda);
}
这不完全是你要求的,因为这个是为了翻译来自视图中网格的过滤器表达式(在FilterContainer中)而写的,但是它给出了如何自己编写“喜欢”的想法< / p>
答案 1 :(得分:0)
如果你的“动态”取决于某个条件,那么它们是肯定的。首先在没有这个条件的情况下构建linq查询。然后添加if语句并添加适当的条件。
var query = ....;
if (value1 = condition1) {
query = from q in query
where SqlMethods.Like(s.GradeLevel, grade);
}
if (value2 == condition2) {
query = from q in query
where SqlMethods.Like(s.Name, name);
}
查询将在最后可能的时刻构建,而不是提前构建,因此您可以安全地使用此方法。