Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как эффективно выполнить LINQ-запрос к MS SQL ? / 3 сообщений из 3, страница 1 из 1
08.09.2016, 14:53
    #39305926
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как эффективно выполнить LINQ-запрос к MS SQL ?
Есть такая структура

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public class dialog
    {
        public virtual ICollection<users> members { get; set; }

        public virtual ICollection<users> readers { get; set; }
    }

    public class user
    {
        public virtual ICollection<dialog> membersOf { get; set; }

        public virtual ICollection<dialog> readersOf { get; set; }
    }

    user user = getUser();



Есть собственно юзер.

Нужно выбрать только те диалоги, где юзер есть в membersOf и нет в readersOf . Причем нужно из БД только получить результат (число диалогов), не вытягивая всё на клиента (сервер).

1. Как удостовериться, что на клиента (сервер) ничего не вытягивается (желательно подешевле)
2. Как составить запрос, который выполниться полностью в БД?


Сейчас это выглядит так:

Код: c#
1.
var new_dialogs = user.membersOf .Where(x => !x.is_deleted).Where(x => !x.readersOf .Select(z => z.userID).Contains(user.id)).Count();
...
Рейтинг: 0 / 0
08.09.2016, 16:17
    #39305998
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как эффективно выполнить LINQ-запрос к MS SQL ?
MonochromatiqueСейчас это выглядит так:

Неправильно, ты делаешь запрос к навигационному свойству, а надо делать запрос через контекст.

Код: c#
1.
var new_dialogs = dbContext.users.Select(x => x.id == <ID юзера>).SelectMany(x => x.membersOf).Where(x => !x.is_deleted).Where(x => !x.readersOf .Select(z => z.userID).Contains(user.id)).Count();



Monochromatique1. Как удостовериться, что на клиента (сервер) ничего не вытягивается (желательно подешевле)

Посмотреть в отладчике, или вывести в лог.

Monochromatique2. Как составить запрос, который выполниться полностью в БД?

Через контекст. Только через контекст. Когда обращаешься к навигационной сущности экземпляра, она инстанцируется (коллекция материализуется), и ты получаешь SELECT N+1.
...
Рейтинг: 0 / 0
08.09.2016, 18:15
    #39306109
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как эффективно выполнить LINQ-запрос к MS SQL ?
hVosttMonochromatiqueСейчас это выглядит так:

Неправильно, ты делаешь запрос к навигационному свойству, а надо делать запрос через контекст.

Код: c#
1.
var new_dialogs = dbContext.users.Select(x => x.id == <ID юзера>).SelectMany(x => x.membersOf).Where(x => !x.is_deleted).Where(x => !x.readersOf .Select(z => z.userID).Contains(user.id)).Count();



Monochromatique1. Как удостовериться, что на клиента (сервер) ничего не вытягивается (желательно подешевле)

Посмотреть в отладчике, или вывести в лог.

Monochromatique2. Как составить запрос, который выполниться полностью в БД?

Через контекст. Только через контекст. Когда обращаешься к навигационной сущности экземпляра, она инстанцируется (коллекция материализуется), и ты получаешь SELECT N+1.

Понял тебя.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как эффективно выполнить LINQ-запрос к MS SQL ? / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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