Соединения Entity Framework в циклах - PullRequest
0 голосов
/ 09 января 2012

У меня есть список целых чисел с именем IDsList, который используется для извлечения списка строк XML из таблицы с именем MyTbl с использованием соединения с сущностной структурой. Затем строки XML используются для выполнения других задач. Что из следующего будет лучше?

Метод 1

var IDsList = new List<Int32> () {17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input
List<String> XMLStrs = null;
using (var ctx = new DatabaseEntities ()) {
    XMLStrs = IDsList.Select (i => Ctx.MyTbl.First (tr => tr.id == i).xml_str).ToList ();
}
XMLStrs.AsParallel ().ForAll (xs => {
    // Do something in parallel
});

Метод 2

var IDsList = new List<Int32> () {17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input
IDsList.AsParallel ().ForAll (i => {
    using (var ctx = new DatabaseEntities ()) {
        var xs = ctx.MyTTbl.First (tr => tr.id == i).xml_str;
        // Do something with xs
    }
});

Или есть другой метод, более идиоматический C #?

Обратите внимание , что список IDsList, как правило, намного длиннее, часто длиной в несколько тысяч. И каждое отдельное выполнение определенного значения xs занимает примерно столько же времени, сколько и любое другое.

1 Ответ

0 голосов
/ 09 января 2012

Если вы пытаетесь получить строки с идентификатором, который существует в IDsList, в EF 4.1 вы можете использовать .Contains в ваших запросах:

var IDsList = new []{17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input
List<string> XMLStrs = null;
using (var ctx = new DatabaseEntities()) 
{
    XMLStrs = (from tr in Ctx.MyTbl
               where IDsList.Contains(tr.id)
               select tr.xml_str).ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...