【问题标题】:Dynamic "WHERE IN" on IQueryable (linq to SQL)IQueryable 上的动态“WHERE IN”(linq to SQL)
【发布时间】:2010-05-05 16:35:48
【问题描述】:

我有一个 LINQ to SQL 查询,将表中的行返回到 IQueryable 对象中。

IQueryable<MyClass> items = from table in DBContext.MyTable
select new MyClass
{
 ID = table.ID,
 Col1 = table.Col1,
 Col2 = table.Col2
}

然后我想对结果执行 SQL“WHERE ... IN ....”查询。使用以下方法可以正常工作。 (返回ID为ID1 ID2或ID3的结果)

sQuery = "ID1,ID2,ID3";
string[] aSearch = sQuery.Split(',');
items = items.Where(i => aSearch.Contains(i.ID));

我想做的是执行相同的操作,但不必指定 i.ID 部分。因此,如果我有要应用“WHERE IN”子句的字段名称字符串,如何在 .Contains() 方法中使用它?

【问题讨论】:

    标签: c# linq-to-sql lambda


    【解决方案1】:

    有几种方法可以做到这一点。一种方法是使用Dynamic Linq。另一种方法是使用Predicate Builder

    【讨论】:

    • 罗伯特,谢谢你的帖子。 Dynamic Linq 看起来它将允许我将字段指定为基于字符串的查询,这是我想要的,但我不确定它是否支持 SQL IN 子句。 Predicate Builder 看起来我可以通过将 Predicate.Or 表达式链接在一起来创建一个表达式,但我不知道如何在每个表达式中使用我的列名字符串。我尝试过反思,并调用 Equals 方法,但还没有运气。
    【解决方案2】:

    你必须建立一个表达式树。它最终看起来像这样(部分代码,不会编译)。这个既包含又等于。本项目使用:http://weblogs.asp.net/rajbk/archive/2010/04/15/asp-net-mvc-paging-sorting-filtering-a-list-using-modelmetadata.aspx

    var param = Expression.Parameter(filterType, propertyName);
    var left = Expression.Property(param, filterType.GetProperty(propertyName));
    var right = Expression.Constant(propertyValue, modelMetaData.ModelType);
    
    LambdaExpression predicate = null;
    
    if (searchFilterAttribute.FilterType == FilterType.Contains)
    {
        var methodContains = typeof(string).GetMethod("Contains", new[] { typeof(string) });
        var filterContains = Expression.Call(left, methodContains, right);
        predicate = Expression.Lambda(filterContains, param);
    }
    else
    {
        var expr = Expression.Equal(left, right);
        predicate = Expression.Lambda(expr, param);
    
    }
    
    var expression = Expression.Call(
        typeof(Queryable), 
        "Where", 
        new Type[] { queryable.ElementType },
        queryable.Expression,
        predicate);
    
    queryable = queryable.Provider.CreateQuery<T>(expression);
    

    我可能会将其重写为可重用的扩展方法(目前它过于特定于该项目)并在博客中介绍它。

    【讨论】:

    • 感谢您的回答 Raj,但我认为这将允许我检查字段是否包含字符串。我想使用 contains 执行等效的 SQL IN。即数组包含字段,而不是字段包含字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多