说我有一个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]));
}
我想知道的是,如果有更有效的方法吗?每行返回的数据不多(多个nvarchar
和int
列),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 });
}
旁注:有效率,我的意思是干净的代码和性能。
答案 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;