Linq To SQL: самый эффективный способ циклического просмотра списка идентификаторов - PullRequest
1 голос
/ 31 августа 2011

Скажем, у меня есть список идентификаторов:

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), и список идентификаторов может быть до 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 ]

4 голосов
/ 31 августа 2011

Существует, конечно, простой способ написания того же кода:

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();
3 голосов
/ 31 августа 2011
var myProducts = from bar in db.Bars
             where ids.Contains(bar.Id)
            select bar;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...