WCF Ria, LINQ to Entity проекция, фильтрация, отложенное выполнение - PullRequest
0 голосов
/ 16 сентября 2011

Допустим, у меня есть следующие сущности

  • Пользователь

    • Идентификатор_пользователь
    • UserName
    • UserNameAsLower
    • Профиль (свойство навигации)
  • Профиль

    • Идентификатор_пользователь
    • E-mail
    • EmailAsLower
    • Язык

и я хочу вернуть консолидированный объект, давайте назовем его UserDTO, но удалим некоторые поля, которые мы не хотим, чтобы пользователь видел (AsLower stuff)

  • UserDTO
    • Идентификатор_пользователь
    • UserName
    • E-mail
    • Язык

если я напишу запрос LINQ следующим образом, а затем применю к нему критерии фильтрации, будет ли он выполняться в этот момент, так как критерии фильтра применяются к именам свойств прогнозируемого класса?

public IQueryable<UserDTO> GetUsers() 
{
   IQueryable<UserDTO> users = (from u in Entities.Users select new UserDTO() { UserID = u.UserID, UserName = u.UserName, Email = u.Profile.Email, Language = u.Profile.Email });
   users = users.Where( u => u.UserName.Contains("Admin") );

   return users;
}

Причина, по которой я спрашиваю, состоит в том, что если таблица базы данных за ней оказывается действительно большой (миллионы записей), я хочу убедиться, что она не пытается сначала загрузить ее в память.

1 Ответ

1 голос
/ 21 сентября 2011

RIA выполнит запрос LINQ со всеми примененными фильтрами и только сериализует обратно результаты.

Порядок операций следующий: клиент создает IQueryable, клиент перечисляет IQueryable, RIA превращает IQueryable.Expression в запрос GET, серверанализирует запрос GET в дереве выражений и восстанавливает IQueryable, сервер выполняет выражение с использованием IQueryProvider, сервер сериализует ответ клиенту.

...