|
Linq - вторая форма Select
|
|||
---|---|---|---|
#18+
Добрый день! Хочу в последовательности полученной из базы данных (repository.Products) получить индекс того или иного элемента в этой последовательности. Казалось бы, используй вторую форму Select, которая определяется следующим образом Queryable.Select<TSource, TResult> - метод (IQueryable<TSource>, Expression<Func<TSource, Int32 , TResult>>) и дело в шляпе! Но не тут-то было! Это работает на массиве и не работает на той последовательности, которую я получил из базы (IQurable<...>), хотя, вроде, всё одинаково. Компилируется нормально, а при выполнении запроса идёт ошибка (см. рисунок). Что тут не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2015, 16:57 |
|
Linq - вторая форма Select
|
|||
---|---|---|---|
#18+
ValGer, не все методы C# поддерживаются в LINQ to SQL/EF. Пронумеровать записи можно и без помощи сервера: Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2015, 17:10 |
|
Linq - вторая форма Select
|
|||
---|---|---|---|
#18+
bazile, Ну да, ну да! Тупой перебор - это первое, что мне пришло в голову, но потом попался примерчик с массивом и я решил попробовать по аналогии. Тем более, что ни о каких ограничениях в Msdn-не ничего не говорилось. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2015, 17:20 |
|
Linq - вторая форма Select
|
|||
---|---|---|---|
#18+
bazile, Нашёл я выход из положения. Нужно перед использованием Select((...) => ...) полученную из базы данных последовательность преобразовать к IEnumerable<Тип> и тогда всё получается без ошибок выполнения. var qProd = repository.Products. AsEnumerable<Product>(). Select((p, idx) => new { index = idx, nam = p.Name }); foreach (var anonObj in qProd) { Console.WriteLine("idex = {0} Название = {1}", anonObj.index, anonObj.nam); }; ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2015, 11:37 |
|
Linq - вторая форма Select
|
|||
---|---|---|---|
#18+
Ну так Базиль вам так и написал. Используя AsEnumerable вы переходите от Linq to EF к Linq to Objects. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2015, 14:48 |
|
Linq - вторая форма Select
|
|||
---|---|---|---|
#18+
ValGer, это называется материализация - то есть инициация выполнения SQL запроса и получение данных. В данном случае это правильный прием. Кстати что касается поддерживаемых/неподерживаемых методов класса Enumerable, то это описано в MSDN на отдельных страницах: LINQ to SQL: Standard Query Operator Translation (LINQ to SQL) + Data Types and Functions EF: Supported and Unsupported LINQ Methods (LINQ to Entities) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2015, 15:50 |
|
Linq - вторая форма Select
|
|||
---|---|---|---|
#18+
bazile, Ну тут про себя только и могу сказать: "Если ничего не помогает, то читайте документацию!" ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2015, 19:03 |
|
Linq - вторая форма Select
|
|||
---|---|---|---|
#18+
bazileValGer, это называется материализация - то есть инициация выполнения SQL запроса и получение данных. В данном случае это правильный прием. Давно хотел спросить - а как быть, когда данных много, а методы транслировать не получается? Операции с датой, со строками, например... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2015, 14:34 |
|
|
start [/forum/topic.php?fid=17&fpage=14&tid=1349570]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 153ms |
0 / 0 |