Почему этот запрос соединения LINQ работает, а другой - нет? - PullRequest
5 голосов
/ 04 августа 2011

Я написал два запроса LINQ, используя метод join. По сути, если я переключаю порядок объектов, которые нужно объединить, запрос больше не работает и выдает ошибку:

"Невозможно создать постоянное значение типа 'Domain.Entities.UsersSitesRole'. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid ')."

        var foo2 = //works
            from p in privilegesForUser
            join c in repository.Child on p.SiteId equals c.Child_SiteID
            select new { ChildID = c.Child_ChildID, name = c.Child_FirstName, site = c.Child_SiteID, p.PrivilegeLevel };

        var foo3 = //throws exception
            from c in repository.Child
            join p in privilegesForUser on c.Child_SiteID equals p.SiteId
            select new { ChildID = c.Child_ChildID, name = c.Child_FirstName, site = c.Child_SiteID, p.PrivilegeLevel };

Объект privilegesForUser является списком сущностей, полученных из моего контекста Entity Framework (UsersSiteRole), а repository.Child также является IQueryable<Child> из моего контекста EF.

1 Ответ

4 голосов
/ 04 августа 2011

Это вызвано тем, что EF анализирует дерево выражений, которое оно получает в методах расширения.

Во многих случаях запрос логически корректен и прекрасно выполняется на IEnumerable (Linq to Objects), но завершается неудачно в Linq to Entities.По сути, практически невозможно скомпилировать любое дерево логических выражений в правильные операторы SQL (SQL не идеален и далек от объектно-ориентированного мира), и это тот случай, когда EF сдается.Со временем вы привыкнете понимать, что работает, а что нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...