2010-07-15 17 views
3

我想查詢給定數組的數據,通過使用Silverlight客戶端API通過WCF數據服務進行篩選。基本上,我想查詢給定一個國家列表(數組)的僱員。帶有陣列輸入和變量的LINQ查詢聲明 - 建議

我想是這樣的:

public IQueryable<Employee> Load(string[] states) 
{ 
    foreach (var x in states) 
    { 
      // LINQ query here with 1 to N .Where statements 
      return from e in Context.Employees 
      .Where(...) 
    } 
} 

所以我們可以說我的數組中有2項,即我想通過2個狀態查詢,我會做這樣的事情手動:

return from e in Context.Employees 
    .Where(e => e.State== states[0] || e.State == states[1]))); 

任何意見將不勝感激!

+0

您使用LINQ to SQL或實體框架還是純LINQ? – 2010-07-15 19:12:36

+0

已編輯原始帖子 - 在Silverlight 3.0(Silverlight客戶端庫)中使用WCF數據服務(Astoria 1.0)。 – user118190 2010-07-15 19:22:30

回答

0

這裏有你想要做什麼,我覺得一個可運行的例子嗎?給定一個州的名單,它會給你那些在這些州的僱員。

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<string> states = new List<string>(); 
      states.Add("SC"); 
      states.Add("TX"); 
      states.Add("NC"); 

      List<Employee> emps = new List<Employee>(); 
      emps.Add(new Employee() { State = "GA", Name = "Bill" }); 
      emps.Add(new Employee() { State = "TX", Name = "John" }); 
      emps.Add(new Employee() { State = "SC", Name = "Mary" }); 

      //Here's where the work is done. The rest is fluff... 
      var empsinstates = from e in emps where states.Contains(e.State) select e; 

      foreach (var e in empsinstates) 
      { 
       Console.WriteLine(e.Name + " " + e.State); 
      } 
      Console.Read(); 
     } 
    } 
    class Employee 
    { 
     public string State; 
     public string Name; 
    } 
} 
+0

這適用於LINQ to Object,但(肯定)不適用於實體框架或LINQ to SQL。 – 2010-07-15 19:14:59

+0

這就是我所得到的:{將Linq表達式轉換爲URI時出錯:不支持方法'Contains'。} – user118190 2010-07-15 19:34:53

1

Context.Employees.ToList()。其中​​(x => states.Contains(x.State))

+0

這不適用於EntityFramework或LINQ to SQL。如果這是因爲參數是'IQeryable'而不是'IEnumerable',我假設有一個。 – 2010-07-15 18:59:37

+0

它應該這樣做,如果你在哪裏調用tolist()。 – gmn 2010-07-15 19:01:29

+0

如果這是一張大桌子,您可能需要考慮性能,但所有員工都可以閱讀,然後應用過濾器 – gmn 2010-07-15 19:04:15

5

您可以動態構建條件的表達式樹。

var parameter = Expression.Parameter(typeof(Employee), "employee"); 

Expression condition = Expression.Constant(false); 

foreach (var state in states) 
{ 
    condition = Expression.OrElse(
     condition, 
     Expression.Equal(
      Expression.Property(parameter, "State"), 
      Expression.Constant(state))); 
} 

var expression = Expression.Lambda<Func<Employee, Boolean>>(condition, parameter); 

然後只是執行呼叫。

var result = Context.Employees.Where(expression); 

我不是100%確定,如果這可以爲​​你開箱即用,但我希望總體想法有所幫助。

+0

可能不是'或者'而是'OrElse'。和'參數(typeof(Employee)...' – 2010-07-15 19:40:59

+0

謝謝,你是對的 - 我用'String'的列表編寫了測試代碼,並忘記將其更改爲'Employee','Or'和' OrElse'應該無關緊要,但是當然通常會使用條件語句而不是正常語句。 – 2010-07-15 21:14:55

+0

DanielBrückner好評,但Equal方法是區分大小寫的比較,而不是如何執行不區分大小寫的比較?Expression.Contains( )方法不存在 – Max 2013-01-02 16:55:19