LINQ to Entities пытается спроецировать две таблицы и объединить их - PullRequest
0 голосов
/ 04 октября 2018

У меня есть две таблицы: свойства, аренда

, у которых есть пара похожих свойств, таких как: AreaInSquareMeters, RentalPrice и т. Д. У меня есть DTO, в который я хочу спроецировать их, а затем объединить их в одно целое.Но если я сопоставлю коллекции с DTO, возникнет исключение:

The 'Distinct' operation cannot be applied to the collection ResultType of the specified argument.Parameter name: argument

Это небольшой код, который вызывает исключение

var properties = Context.Properties.Select(property => new PropertyInfoDTO
            {
                Id = property.Id,
                PropertyName = property.PropertyName,
                SellingPrice = property.SellingPrice,
                RentalPrice = property.RentalPrice, 
                Images = property.Images.Select(image => new PropertyImagesInfoDTO
                {
                    ImagePath = image.ImagePath,
                    ImageRatio = image.ImageRatio
                }).ToList(), 
                other properties mapped here
           }

Тогда:

var rentals = Context.Properties.Select(property => new PropertyInfoDTO
            {
                Id = property.Id,
                PropertyName = property.Property.PropertyName,
                SellingPrice = property.Property.SellingPrice,
                RentalPrice = property.RentalPrice, 
                    Images = property.Property.Images.Select(image => new PropertyImagesInfoDTO
                    {
                        ImagePath = image.ImagePath,
                        ImageRatio = image.ImageRatio
                    }).ToList(), 
                other properties mapped here
           }

и я хочу сделать в целом:

properties = properties.Union(rentals);

Все в порядке, пока я не сделаю запрос к БД и не попытаюсь его материализовать. Есть предложения, как привести их к некоторому DTO и агрегировать их?

1 Ответ

0 голосов
/ 05 октября 2018

Union является неявным Distinct.Там нет тривиального способа определения отдельных объектов, когда у объектов есть члены коллекции.Это то, что пытается сказать исключение.

Но, увидев свой класс PropertyInfoDTO, вы, вероятно, не собирались делать коллекцию особенной в любом случае.Структура PropertyInfoDTO требует, чтобы вы использовали Concat, который просто объединяет две коллекции без неявного Distinct.

Однако в EF6, если вы делаете ...

properties = properties.Concat(rentals);

... вы получите EntityCommandCompilationException высказывание

Вложенный запрос не поддерживается.Operation1 = 'UnionAll' Operation2 = 'MultiStreamNest'

... что означает, что EF не удалось преобразовать выражение запроса в один оператор SQL.В EF-core вы также получите исключение, но другое.

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

var properties = Context.Properties.Select(...)
    .AsEnumerable();
properties = properties.Concat(rentals);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...