|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Для справки о выражениях инициализации: http://msdn.microsoft.com/ru-ru/library/bb738566.aspx . Например, я хочу сделать запрос с созданием объектов, поля которых IsSelected - булевые. Как бы сделать это покороче и поудобнее, желательно без использования кода вне этого запроса? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
И вообще, возможно ли это, а то в каких-то ситуациях (не помню точно, каких) у меня ошибки выдавались, что, мол, нельзя в ЛИНК-выражениях при инициализации логику размещать, нужно, мол, вычислять результат вычисления этой логики до запроса ЛИНК и в запросе уже присваивать результат. А то у меня длинно получалось - делаю запрос, а потом отдельно по нужному свойству цикл пускаю, который уже в зависимости от логики устанавливает значение этого свойства. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 13:28 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Ну и делайте вложенный запрос, также как Вы бы это делали в SQL. В чём проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 15:36 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 15:38 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Алексей К, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 16:09 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
А вот ещё вопрос: загружаются ли в программу из БД данные при определении их длины в выражении инициализации в LINQ? Например, мне нужно присвоить булево значение параметру в зависимости от того, имеется ли в столбце с видео это самое видео, но при этом загружать всю строку с этим видео я не хочу: from objects in db.Object select new ObjectModel() { IsSelected = db.Products.Any(products => products.Video != null) }; Этот код не будет ли загружать видео, а всё будет проверять на сервере? Можно и по-другому спросить: в выражениях инициализации доступны абсолютно все элементы языка LINQ, что и в самих запросах? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 16:54 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Вот так лучше Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 16:55 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
user7320А вот ещё вопрос: загружаются ли в программу из БД данные при определении их длины в выражении инициализации в LINQ? Например, мне нужно присвоить булево значение параметру в зависимости от того, имеется ли в столбце с видео это самое видео, но при этом загружать всю строку с этим видео я не хочу: from objects in db.Object select new ObjectModel() { IsSelected = db.Products.Any(products => products.Video != null) }; Этот код не будет ли загружать видео, а всё будет проверять на сервере?Посмотрите профайлером генерируемый SQL запрос, и всё станет понятно. В данном случае ответ: нет, не загружается. user7320Можно и по-другому спросить: в выражениях инициализации доступны абсолютно все элементы языка LINQ, что и в самих запросах?Да. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 16:59 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Я тут запутался немного, и вложенный запрос вроде мне не нужен для моих целей. Если я сделаю вот так: Код: plaintext 1. 2. 3. 4. 5.
то опять всё это превратится в чистый SQL-запрос, без загрузки видео для вычисления его длины? Мне просто непонятно, как бы такой запрос выглядел в чистом SQL - как присвоение свойству IsSelected происходит? Мне важно, чтобы видео именно не запрашивалось из БД, а только его длина и сравнение её с null. А вот как LINQ преобразует вычисление длины и сравнение её с null в SQL? Я не спрашиваю сейчас об основах работы LINQ вообще, а именно этот момент интересует. А что, если бы я не с null сравнивал, а с какой-нибудь величиной? Просто я в SQL почти не разбираюсь, только самое простое изучил. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2011, 13:55 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
>> без загрузки видео для вычисления его длины Я имел ввиду, чтобы не только клиенту не грузилось бы видео, но и на сервере тоже из БД не выгружалось бы видео в виде byte[] в ОЗУ, где определялась бы его длина и сравнивалась бы с null или каким другим значением. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2011, 13:57 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Что мешает запустить Sql Profiler, и посмотреть генерируемые SQL-запросы? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2011, 14:36 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Алексей КЧто мешает запустить Sql Profiler, и посмотреть генерируемые SQL-запросы? У меня Экспресс - я прочитал, что там нет Профайлера. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2011, 15:44 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
А, я уже понял, что неправильно там написал. Надо было не длину на null проверять, а само свойство видео. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2011, 16:19 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2011, 16:19 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
А то он пишет, что никаких функций из того длинного списка, что Интеллисенс выдаёт, применять в LINQ-запросе не может, в т. ч. и вывести свойство Length массива не может. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2011, 16:20 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
>> И вообще, возможно ли это, а то в каких-то ситуациях (не помню точно, каких) у меня ошибки выдавались, что, мол, нельзя в ЛИНК-выражениях при инициализации логику размещать, нужно, мол, вычислять результат вычисления этой логики до запроса ЛИНК и в запросе уже присваивать результат. А, понял - это в LINQ to SQL нельзя, т. к. он бОльшую часть функций преобразования типов из .NET Framework не может перевести в функции SQL по понятным причинам. Чтобы все эти ToString() и прочие применять для всяких DateTime и прочих, надо сначала таки сделать запрос - т. е. загрузить данные из БД в клиента, а потом привести результат к какому-нибудь IEnumerable, и уже в запросе LINQ to Objects можно делать все преобразования из .NET Framework. http://stackoverflow.com/questions/5370402/entity-framework-4-linq-how-to-convert-from-datetime-to-string-in-a-query ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2011, 10:49 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
Да ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2011, 15:32 |
|
Как лучше разместить логику в выражениях инициализации LINQ?
|
|||
---|---|---|---|
#18+
user7320А, понял - это в LINQ to SQL нельзя, т. к. он бОльшую часть функций преобразования типов из .NET Framework не может перевести в функции SQL по понятным причинам. Чтобы все эти ToString() и прочие применять для всяких DateTime и прочих, надо сначала таки сделать запрос - т. е. загрузить данные из БД в клиента, а потом привести результат к какому-нибудь IEnumerable, и уже в запросе LINQ to Objects можно делать все преобразования из .NET Framework.Возможно лучше задачу форматирования данных отдать представлению (контролы, биндинги и т. п.). А для обработки данных возможностей LINQ-to-SQL вполне хватает. Если же требуется что-то специфичное (рекурсивные запросы и т. п.), что не умеет LINQ-to-SQL - это можно вынести в представления (View) в БД и делать LINQ-запросы из них. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2011, 17:38 |
|
|
start [/forum/topic.php?fid=17&fpage=39&tid=1350570]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 131ms |
0 / 0 |