LINQ против DataTable.Select - Как я могу получить те же результаты? - PullRequest
0 голосов
/ 11 мая 2009

Я пытаюсь переписать прямой (отключенный) DataSet.DataTable.Выберите LINQ для текстового поиска:

string search = "ProductNo like '%" + searchpattern + 
    "%' OR ProductName like '%" + searchpattern + 
    "%' OR Description like '%" + searchpattern +  "%'";

DataSetProducts.sk_productsRow[] dsp = (DataSetProducts.sk_productsRow[])dsProducts.sk_products.Select(search, sort);

Это работает очень быстро. Однако, если я воспроизведу его в LINQ:

productlist = from prds in dsProducts.sk_products.AsEnumerable()
    where (prds.Field<string>("productno").Contains(searchpattern) || 
           prds.Field<string>("productname").Contains(searchpattern) || 
           prds.Field<string>("description").Contains(searchpattern))
    select prds;

Он становится очень медленным из-за текстовых операций и возвращает намного меньше строк. Как я могу достичь тех же результатов с той же скоростью? У меня в таблице всего ~ 1000 записей.

Ответы [ 4 ]

1 голос
/ 12 мая 2009

Я никогда не использовал его сам, но, возможно, i4o - индексированный LINQ может помочь ускорить процесс ...

1 голос
/ 11 мая 2009

Что касается того, почему он возвращает меньше строк, это проблема с учетом регистра? (то есть «like» не учитывает регистр по умолчанию; «Contains» по умолчанию)

Если вы работаете в контексте базы данных LINQ to SQL, используйте операцию System.Data.Linq.SqlClient.SqlMethods.Like вместо String.Contains.

0 голосов
/ 11 мая 2009

Тупой вопрос, но нужен ли для чего-то метод .AsEnumerable ()? До сих пор я имел опыт работы только с Linq2Sql, но обычно я бы рассматривал вещи как AsQueryable как можно дольше, чтобы избежать сценария «загрузить набор данных, а затем сразу же отфильтровать его снова».

0 голосов
/ 11 мая 2009

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

Кроме этого, если вы не установили LINQ Visualizer , который покажет вам запрос, который фактически выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...