Linq To SQL:通过ID列表循环的最有效方式

时间:2011-08-31 08:25:13

标签: c# linq linq-to-sql c#-4.0

说我有一个ID列表:

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

我已经有一个编译的LINQ语句返回单独的行(在这里我们称之为“Bar”)。所以我可以这样做:

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 });
}

旁注:有效率,我的意思是干净的代码和性能。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:3)

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