假设我有一个 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”。这是一个返回“Bar”的简单 LINQ 语句。
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 });
}
旁注:我所说的高效是指干净的代码和明智的性能。
最佳答案
肯定有一种更简单的方式来编写相同的代码:
var foo = ids.Select(id => db.GetBarById(id))
.ToList();
但是,这取决于 db.GetBarById
的实际作用。如果您可以在查询中使用 ids
本身,您也许可以在单个数据库查询中完成所有操作:
var foo = db.Bars
.Where(b => ids.Contains(b.Id))
.ToList();
显然,这并没有使用您现有的 LINQ 查询 - 如果检索单行涉及更多内容,您可能需要做更多的工作。
编辑:好的,现在我们有了 single 方法,它相当简单......虽然你可能应该使用连接,老实说......而且我怀疑你的真实代码有 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();
关于c# - 林克到 SQL : Most Efficient Way of Looping through List of ID's,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254387/