System.Linq.Dynamic和Sql IN运算符

时间:2010-08-18 11:58:29

标签: c# linq-to-sql

  

可能重复:
  'Contains()' workaround using Linq to Entities?

我正在使用System.Linq.Dynamic库为GUI基础查询引擎提供动力,但我似乎无法找到对Sql IN运算符等效的支持。有没有人用过这个?

我已经搜索过,发现了一些可能的副本,但是没有一个是我要求的(或者已经解决了)。

澄清:

我正在使用动态查询API在Linq中构建查询,例如:

var customers = dbDataContext
                 .Clients
                 .Where("Lastname = @0", "Smith");

哪个工作正常,我正在努力的一个运算符相当于Sql IN运算符。我想这样做:

var customers = dbDataContext
                 .Clients
                 .Where("ProductIDsPurchased IN (1,6,8,90)");

但是我不知道如何使用动态查询来编写它(上面的方法不起作用)。

1 个答案:

答案 0 :(得分:7)

可能this Stackoverflow线程可以帮助你......

摘自主题:

你可以实现自己的WhereIn方法:

public static IQueryable<TEntity> WhereIn<TEntity, TValue>
 (
     this ObjectQuery<TEntity> query, 
     Expression<Func<TEntity, TValue>> selector, 
     IEnumerable<TValue> collection
 )
{
    if (selector == null) throw new ArgumentNullException("selector");
    if (collection == null) throw new ArgumentNullException("collection");
    ParameterExpression p = selector.Parameters.Single();

    if (!collection.Any()) return query;

    IEnumerable<Expression> equals = collection.Select(value => 
      (Expression)Expression.Equal(selector.Body, 
       Expression.Constant(value, typeof(TValue))));

    Expression body = equals.Aggregate((accumulate, equal) => 
    Expression.Or(accumulate, equal));

    return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p));
}

用法:

public static void Main(string[] args)
{
    using (Context context = new Context())
    {
        //args contains arg.Arg
        var arguments = context.Arguments.WhereIn(arg => arg.Arg, args);   
    }
}

在你的情况下:

var customers = dbDataContext
             .Clients
             .WhereIn(c=> c.LastName, new List<string>{"Smith","Wesson"});

HTH