2010-08-18 60 views
3

可能重複:
'Contains()' workaround using Linq to Entities?System.Linq.Dynamic和SQL IN操作符

我使用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)"); 

但我不知道如何使用動態查詢(以上不起作用)編寫此。

+0

@Marcos:你可以創建上存在的問題,而不是重複它賞金。 – 2010-08-18 12:01:27

+1

@Mark Byers:我確實考慮過這個問題,但是我發現的問題中沒有一個是問我究竟是什麼 – Macros 2010-08-18 12:10:42

+0

您能否詳細說明一下?或者將我指向你的其他問題? SQL In = .Any() – Nix 2010-08-18 12:23:47

回答

6

大概this線#1可以幫助你......從線程

摘錄:

,你可以實現你自己的方法,其特徵在於:

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

+0

感謝您的廣泛答案和示例 - 我會給出這個答案 – Macros 2010-08-18 16:29:55

+1

這不會以我的方式工作之後由於字段名也需要動態 – Macros 2010-08-18 21:27:29

+0

查看David Buchanan對此問題的處理方法。他用反射來做到這一點。 http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/5edb3dd0-c778-47e2-b89d-a9c90a0bd1bc/ – Stephane 2010-08-19 08:08:03