2010-08-27 1 views
0

Я читаю записи из базы данных и проверяю некоторые условия и храните их в List<Result>. Результат - это класс. Затем выполните запрос LINQ в List<Result>, например, группировку, подсчет и т. Д. Таким образом, может быть вероятность того, что мин. 50 000 записей в List<Result>, поэтому в этом ли лучше, чтобы LINQ (или) повторно вставлял записи в db и выполнял запросы?LINQ performance

+2

Это может зависеть от характера ваших запросов. Если запросы могут быть полезны из индексов базы данных, и если вы ожидаете выполнить множество запросов, а общая выгода перевешивает «налог на повторную вставку», вы можете воспользоваться использованием таблицы SQL. Без каких-либо подробностей трудно рекомендовать больше, чем «попробовать и сообщить нам». – kbrimington

+0

И после того, как вы попробуете, было бы интересно посмотреть, будет ли переход к PLINQ в .NET 4.0 для вас более высокой. Держать нас в курсе! – Dave

+0

Какой LINQ? LINQ to SQL? –

ответ

0

Почему бы не сохранить его в IQueryable вместо списка и использовать LINQ to SQL или LINQ to Entities, фактический набор данных никогда не будет выгружен в память, и запросы фактически перейдут в базу данных для запуска.

Пример:

Database db = new Database(); // this is what L2E gives you... 

var children = db.Person.Where(p => p.Age < 21); // no actual database query performed 


// will do : "select count(*) from Person where Age < 21" 
int numChildren = children.Count(); 

var grouped = children.GroupBy(p => p.Age); // no actual query 

int youngest = children.Min(p => p.Age); // performs query 

int numYoungest = youngest.Count(p => p.Age == youngest); // performs query. 

var youngestNames = children.Where(p => p.Age == youngest).Select(p => p.Name); // no query 

var anArray = youngestNames.ToArray(); // performs query 

string names = string.join(", ", anArray); // no query of course 
0

В настоящее время я задаю тот же вопрос прямо сейчас. Я тоже не знаю точного ответа, но из того, что я знаю, LINQ не очень хорошо разбирается в объектах. Кроме того, поскольку List не индексируется, когда вы делаете предварительный запрос на них, бэкэнд, вероятно, потребуется сделать много вычислений, чтобы получить то, что вы просили. Кроме того, этот код является общим, поэтому он означает более медленное выполнение.

Лучше всего, если вы в состоянии, сделать все в одном запросе или даже сделать startproc для обработки. Или еще одна возможность, если вы всегда проверяете одно и то же начальное условие, create a view и выполняете свой запрос непосредственно в этой таблице (вместо повторного ввода с клиента). Я думаю, что если у вас более 50 000 результатов, вероятно, использование списка - это не очень хорошая идея (память и производительность).

Это, вероятно, не отвечает на ваш вопрос напрямую, но, помимо выполнения теста, вы не будете знать. Это зависит от того, что вы делаете с данными.

+0

Даже если объекты большие (скажем, 1 КБ), 50 000 из них по-прежнему составляют только 50 МБ памяти. Однако я буду беспокоиться о том, чтобы вытащить эти данные из базы данных. – tster