2011-08-31 58 views
1

說列表循環的最有效的方式,我有ID的列表:的LINQ to SQL:通過ID的

int[] ids = { 1, 2, 3, 4 }; 

我已經有一個返回各行編譯LINQ聲明(讓我們稱之爲「酒吧」這裏)。所以,我可能只是這樣做:

var foo = new List<Bar>(); 
var len = ids.Length; 
for (int i=0; i < len; i++) 
{ 
    foo.Add(db.GetBarByID(ids[i])); 
} 

我想知道是,如果有這樣做的更有效的方法?有沒有每行返回如此多的數據(幾nvarcharint列)和ID的列表中可高達50

更新:

我將闡述「GetBarByID」。這是一個簡單的LINQ語句,它返回「Bar」。

class Bar 
{ 
    public int ID {get; set;} 
    public string Name {get;set;} 
    public int Age {get;set;} 
    public string Blah{get;set;} 
} 

IQueryable<Bar> GetBarByID(int ID) 
{ 
    return db.Bar 
      .Where(w => w.Barid == ID) 
      .SelectMany(b => Othertable.Where(w => w.barid == b.id), 
       (b, x) => new Bar { ID = s.id, Name = s.name, Age = s.age, Blah = x.blah }); 
} 

附註:通過高效,我的意思是乾淨的代碼和性能明智。

回答

4

有一定編寫相同的代碼的簡單方式:

var foo = ids.Select(id => db.GetBarById(id)) 
      .ToList(); 

但是,要看是什麼db.GetBarById確實。如果你可以在查詢中使用ids本身,你也許可以做整個事情在一個單一的數據庫查詢:

var foo = db.Bars 
      .Where(b => ids.Contains(b.Id)) 
      .ToList(); 

顯然,這不是使用現有的LINQ查詢,但 - 如果有更多的參與檢索單排,你可能需要做更多的工作。

編輯:好的,現在我們已經拿到了一個方法,這也很容易...雖然你或許應該使用一個連接,說實話...我懷疑你真正代碼有w.Barid == ID,而不是w.Barid = ID

var foo = db.Bar 
      .Where(w => ids.Contains(w.Barid)) 
      .SelectMany(b => Othertable.Where(w => w.barid == b.id), 
           (b, x) => new Bar { ID = s.id, Name = s.name, 
                Age = s.age, Blah = x.blah }) 
      .ToList(); 
+0

問題更新 – jzm

+0

@rudeovski只是堅持在以後的SelectMany在容斯在那裏回答 –

+0

@rudeovski澤熊:答案編輯。 –

3
var myProducts = from bar in db.Bars 
      where ids.Contains(bar.Id) 
      select bar;