powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework запросы к связанным коллекциям
7 сообщений из 7, страница 1 из 1
Entity Framework запросы к связанным коллекциям
    #38452660
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
используется EF и подход
Предположим есть сущность

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class User
{
     [Key]
     public long Id { get; set; }

     public string Login { get; set; }

     public virtual ICollection<Message> Messages;
}



собственно коллекция сообщений загружается только при обращении. (что правильно)

но если я хочу сделать например запрос

user.Messages.Where(e => e.Rating < 100);

то он сначала загрузит всю коллекцию сообщений а только потом выполнить запрос.

как можно этого избежать? и можно ли вообще.
...
Рейтинг: 0 / 0
Entity Framework запросы к связанным коллекциям
    #38452726
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FsShomanно если я хочу сделать например запрос
user.Messages.Where(e => e.Rating < 100);
то он сначала загрузит всю коллекцию сообщений а только потом выполнить запрос.
Это не так. Будет сформирован один запрос. Можешь убедиться в этом посмотрев запрос в IntelliTrace панели или через LINQPad.
...
Рейтинг: 0 / 0
Entity Framework запросы к связанным коллекциям
    #38452746
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazileFsShomanно если я хочу сделать например запрос
user.Messages.Where(e => e.Rating < 100);
то он сначала загрузит всю коллекцию сообщений а только потом выполнить запрос.
Это не так. Будет сформирован один запрос. Можешь убедиться в этом посмотрев запрос в IntelliTrace панели или через LINQPad.

в том то и дело что так...

а запрос в IntelliTrace
формируется вида select ... from dbo.Messages where UserId == param1..

тоесть он делает выборку всех строк для этого пользователя.
ну и + видно по скорости исполнения запроса. с ростом кол-ва элементов доходит почти до секунды.
...
Рейтинг: 0 / 0
Entity Framework запросы к связанным коллекциям
    #38452808
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FsShoman, тогда тут что-то другое. Непонятно с какой стати тут выполняется выборка по UserId если в LINQ выражении участвует только рейтинг. Я проверял на БД AdventureWorks. Для кода
Код: c#
1.
Customers.Where(c => c.CustomerAddresses.Any(ca => ca.AddressType == "Main Office"))

генерируется запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'Main Office'
-- EndRegion
SELECT [t0].[CustomerID], [t0].[NameStyle], [t0].[Title], [t0].[FirstName], [t0].[MiddleName], [t0].[LastName], [t0].[Suffix], [t0].[CompanyName], [t0].[SalesPerson], [t0].[EmailAddress], [t0].[Phone], [t0].[PasswordHash], [t0].[PasswordSalt], [t0].[rowguid] AS [Rowguid], [t0].[ModifiedDate]
FROM [SalesLT].[Customer] AS [t0]
WHERE EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [SalesLT].[CustomerAddress] AS [t1]
    WHERE ([t1].[AddressType] = @p0) AND ([t1].[CustomerID] = [t0].[CustomerID])
    )

То есть все выбирается одним запросом.

Рассказывай конкретнее:
1) Какая версия VS?
2) Что используешь LINQ to SQL или EF? Какой версии?
3) Какая структура таблиц User и Messages? Какие первичные и внешние ключи?
4) Правильно ли отражены ключи в модели?
...
Рейтинг: 0 / 0
Entity Framework запросы к связанным коллекциям
    #38452849
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile,

ты немного путаешь:

Код: c#
1.
Customers.Where(c => c.CustomerAddresses.Any(ca => ca.AddressType == "Main Office"))



у тебя в примере
Customers это DbSet, он реализует интерфейс IQueriable

у меня же это ICollection в сущности User

Код: c#
1.
public virtual ICollection<Message> Messages;



куда Entity подгружает все элементы при первом запросе к коллекции.(lazyloading)

если же убрать virtual то элементы загрузятся в том же запросе в котором получается сущность user
...
Рейтинг: 0 / 0
Entity Framework запросы к связанным коллекциям
    #38455128
Dmitry Gurianov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По исходному примеру профайлер показал 1 запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Name] AS [Name]
    FROM [dbo].[User] AS [Extent1]
    WHERE  EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[Message] AS [Extent2]
        WHERE ([Extent1].[UserId] = [Extent2].[UserId]) AND (2 = [Extent2].[Rating])
    )
...
Рейтинг: 0 / 0
Entity Framework запросы к связанным коллекциям
    #38462968
FsShoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Gurianov,

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


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