2011-08-31 56 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;