2012-03-07 1 views
0

Я начинаю в Linq, и я заметил, что мой внутренний запрос соединения медленнее и менее эффективен, чем, например, пересечение таблиц в коде. Кроме того, эти данные, загружаемые в ListView, намного легче.Эффективность столов на Linq

Вот код:

public static IEnumerable<Alumno> GetItems() 
{ 
     return (from gal in me.Table<GrupoAlumno>() 
       join alu in me.Table<Alumno>() 
       on gal.IdAlumno equals alu.ID 
       select alu); 
} 

Как это возможно?

спасибо.

+0

Какой тип 'me.Table ()' и 'me.Table ()'? Что именно возвращается? Не могли бы вы также показать нам код, который быстрее? – svick

+0

-1 непонятный вопрос. Мой первый вопрос (со многими другими): Используете ли вы LinqToSql или LinqToObjects? –

+0

Прошу прощения за мой английский. Я не знаю разницы между ними. В любом случае вопрос решается. Спасибо – daniherculano

ответ

1

Моя проблема решена. Необходимо было преобразовать toList(), и теперь загрузка данных в мой ListView отлично работает.

public static IEnumerable<Alumno> GetItems() 
{ 

     return (from gal in me.Table<GrupoAlumno>() 
       join alu in me.Table<Alumno>() 
       on gal.IdAlumno equals alu.ID 
       select alu).ToList(); 
} 
0

Операторы Linq работают на IEnumerable<T>, поэтому теперь могут делать предположения о сортируемых данных и не использовать какие-либо более эффективные способы доступа к данным, чем просто перебирать их.

Когда количество данных увеличивается, часто можно писать гораздо более эффективный код, используя другие конструкции, которые используют преимущества хранения данных и других известных фактов о данных.

Если производительность является проблемой (вы прокомментировали свой код, чтобы убедиться, что это действительно проблема?), Тогда linq, вероятно, не подходит. Я думаю, что linq потрясающе выражает поиск и манипулирование данными, когда производительность менее важна, чем время, которое требуется для реализации. Если это наоборот, linq может быть слишком медленным для вас.

1

Я не согласен с существующим принятым ответом!

Linq не просто работает на IEnumerable<T> - он также может работать на IQueryable<T>, и когда это происходит, оператор Linq часто выполняется на языке запросов, таком как SQL. В этом случае Linq очень похож по производительности на работу непосредственно в SQL, но имеет и другие преимущества, такие как проверка типа времени компиляции и intellisense.

Я согласен с @Anders, что всякий раз, когда вы сталкиваетесь с проблемами производительности, тогда измерение того, что происходит, является хорошим первым шагом - но я определенно не согласен с тем, что «linq - это, вероятно, не путь» - я бы сказал наоборот - «linq - это, вероятно, путь», но, пожалуйста, убедитесь, что вы измеряете и понимаете, что происходит - так же, как с SQL, слишком сложно для вашего запроса linq делать то, чего вы действительно не ожидали!

+0

Я предположил, что ОП спрашивает о линк-объектах, так что это контекст моего ответа. Linq-to-something, который использует 'IQueryable ' - это совершенно другая история о производительности. –

+1

Понял :) Я был немного осторожен, потому что в нем содержалось «Таблица », из-за чего я думал, что OP должен использовать SQLite ... но что-то говорит мне, что мы никогда не узнаем правду :) – Stuart