powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как лучше разместить логику в выражениях инициализации LINQ?
17 сообщений из 17, страница 1 из 1
Как лучше разместить логику в выражениях инициализации LINQ?
    #37525377
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для справки о выражениях инициализации: http://msdn.microsoft.com/ru-ru/library/bb738566.aspx .

Например, я хочу сделать запрос с созданием объектов, поля которых IsSelected - булевые. Как бы сделать это покороче и поудобнее, желательно без использования кода вне этого запроса?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
from objects in db.Object
select new ObjectModel()
{
    Id = objects.Id, // Guid
    Name = objects.Name, // string
    IsSelected = // bool
    // а вот здесь я хочу разместить логику, которая возвращает true или false
    // и делает соответствующее присваивание свойству IsSelected
};

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

А то у меня длинно получалось - делаю запрос, а потом отдельно по нужному свойству цикл пускаю, который уже в зависимости от логики устанавливает значение этого свойства.
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37525734
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и делайте вложенный запрос, также как Вы бы это делали в SQL. В чём проблема?
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37525735
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
from objects in db.Object
select new ObjectModel()
{
    Id = objects.Id,
    Name = objects.Name,
    IsSelected = (from ... in ... where ... select ...).Any()
};
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37525809
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К, спасибо.
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37525931
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот ещё вопрос: загружаются ли в программу из БД данные при определении их длины в выражении инициализации в LINQ?

Например, мне нужно присвоить булево значение параметру в зависимости от того, имеется ли в столбце с видео это самое видео, но при этом загружать всю строку с этим видео я не хочу:

from objects in db.Object
select new ObjectModel()
{
IsSelected = db.Products.Any(products => products.Video != null)
};

Этот код не будет ли загружать видео, а всё будет проверять на сервере?



Можно и по-другому спросить: в выражениях инициализации доступны абсолютно все элементы языка LINQ, что и в самих запросах?
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37525932
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так лучше

Код: plaintext
1.
2.
3.
4.
from objects in db.Object
select new ObjectModel()
{ 
    IsSelected = db.Products.Any(products => products.Video != null)
};
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37525943
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320А вот ещё вопрос: загружаются ли в программу из БД данные при определении их длины в выражении инициализации в LINQ?

Например, мне нужно присвоить булево значение параметру в зависимости от того, имеется ли в столбце с видео это самое видео, но при этом загружать всю строку с этим видео я не хочу:

from objects in db.Object
select new ObjectModel()
{
IsSelected = db.Products.Any(products => products.Video != null)
};

Этот код не будет ли загружать видео, а всё будет проверять на сервере?Посмотрите профайлером генерируемый SQL запрос, и всё станет понятно. В данном случае ответ: нет, не загружается.
user7320Можно и по-другому спросить: в выражениях инициализации доступны абсолютно все элементы языка LINQ, что и в самих запросах?Да.
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37527253
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут запутался немного, и вложенный запрос вроде мне не нужен для моих целей. Если я сделаю вот так:

Код: plaintext
1.
2.
3.
4.
5.
from objects in db.Object
select new ObjectModel()
{
    // objects.Video has byte[] type
    IsSelected = objects.Video.Length != null
};

то опять всё это превратится в чистый SQL-запрос, без загрузки видео для вычисления его длины? Мне просто непонятно, как бы такой запрос выглядел в чистом SQL - как присвоение свойству IsSelected происходит? Мне важно, чтобы видео именно не запрашивалось из БД, а только его длина и сравнение её с null. А вот как LINQ преобразует вычисление длины и сравнение её с null в SQL? Я не спрашиваю сейчас об основах работы LINQ вообще, а именно этот момент интересует. А что, если бы я не с null сравнивал, а с какой-нибудь величиной?

Просто я в SQL почти не разбираюсь, только самое простое изучил.
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37527258
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> без загрузки видео для вычисления его длины

Я имел ввиду, чтобы не только клиенту не грузилось бы видео, но и на сервере тоже из БД не выгружалось бы видео в виде byte[] в ОЗУ, где определялась бы его длина и сравнивалась бы с null или каким другим значением.
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37527360
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мешает запустить Sql Profiler, и посмотреть генерируемые SQL-запросы?
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37527523
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЧто мешает запустить Sql Profiler, и посмотреть генерируемые SQL-запросы?
У меня Экспресс - я прочитал, что там нет Профайлера.
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37527594
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, я уже понял, что неправильно там написал. Надо было не длину на null проверять, а само свойство видео.
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37527595
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37527597
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А то он пишет, что никаких функций из того длинного списка, что Интеллисенс выдаёт, применять в LINQ-запросе не может, в т. ч. и вывести свойство Length массива не может.
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37528697
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> И вообще, возможно ли это, а то в каких-то ситуациях (не помню точно, каких) у меня ошибки выдавались, что, мол, нельзя в ЛИНК-выражениях при инициализации логику размещать, нужно, мол, вычислять результат вычисления этой логики до запроса ЛИНК и в запросе уже присваивать результат.

А, понял - это в 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
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37529460
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да
...
Рейтинг: 0 / 0
Как лучше разместить логику в выражениях инициализации LINQ?
    #37529843
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320А, понял - это в LINQ to SQL нельзя, т. к. он бОльшую часть функций преобразования типов из .NET Framework не может перевести в функции SQL по понятным причинам. Чтобы все эти ToString() и прочие применять для всяких DateTime и прочих, надо сначала таки сделать запрос - т. е. загрузить данные из БД в клиента, а потом привести результат к какому-нибудь IEnumerable, и уже в запросе LINQ to Objects можно делать все преобразования из .NET Framework.Возможно лучше задачу форматирования данных отдать представлению (контролы, биндинги и т. п.). А для обработки данных возможностей LINQ-to-SQL вполне хватает. Если же требуется что-то специфичное (рекурсивные запросы и т. п.), что не умеет LINQ-to-SQL - это можно вынести в представления (View) в БД и делать LINQ-запросы из них.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как лучше разместить логику в выражениях инициализации LINQ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]