c# - 林克到 SQL : Most Efficient Way of Looping through List of ID's

标签 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”。这是一个返回“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/

相关文章:

C# - Linq 使用 List 和 Where 子句优化代码

c# - 只选择一个时间间隔内的第一条记录

c# - Linq IN 运算符

c# - 从 JOIN 中选择 IEnumerable 会导致复杂的 Linq-to-SQL 查询

C# 关于参数和运行程序

c# - 可能是Visual Studio 2015中的C#编译器错误

c# - 为什么我的剪贴板监听器被调用两次/应用程序打开两次?

c# - 识别从插件中的 outlook/电子邮件创建的记录

c# - count() > 1 的表达式树

c# - Linq to SQL 不将数据插入数据库