LINQ to SQL在SqlMethods.Like()where where中动态选择列

时间:2014-01-02 16:11:51

标签: c# .net linq linq-to-sql

有没有办法动态选择运行哪个列?我不需要比较,只需动态选择列。

where SqlMethods.Like(s.GradeLevel, grade)

2 个答案:

答案 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;
}

这个做了以下几点:

  • 创建字段表达式
  • 创建常量表达式(在这种情况下要比较的值)
  • 创建一个调用表达式,以对表达式
  • 中的值调用ToLower()
  • 创建一个调用表达式,以对表达式
  • 中的值调用Trim()
  • 'AddNotNullExpression'为值
  • 添加'not null'测试
  • 返回表达式

这是'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);
}

查询将在最后可能的时刻构建,而不是提前构建,因此您可以安全地使用此方法。