Вопрос

Я прокладываю себе путь через код MVC Storefront и пытаюсь следовать пути к репозиторию, сервису и модели, которая является poco, вне контекста dbml / data.На самом деле, за этим довольно легко следить, пока я не начал писать тесты и что-то не сработало непонятным мне образом.

В моем случае первичным ключом является uniqueidentifier, а не поле int.Репозиторий возвращает IQueryable:

public IQueryable<Restaurant> All()
{
    return from r in _context.Restaurants select new Restaurant(r.Id)
        {
             Name = r.Name
        };
 }

В этом случае Restaurant - это Models.Конечно, ресторан, а не _context.Restaurants.Ресторан.

Фильтрация в классе сервиса (или в модульных тестах репозитория) по All(), это работает именно так, как ожидалось:

var results = Repository.All().Where(r => r.Name == "BW<3").ToList();

Это работает просто отлично, имеет одну модель.Ресторан.Теперь, если я попробую проделать то же самое с pkid:

var results = Repository.All().Where(r => r.Id == new Guid("088ec7f4-63e8-4e3a-902f-fc6240df0a4b")).ToList();

Если произойдет сбой с:

The member 'BurningPlate.Models.Restaurant.Id' has no supported translation to SQL.

Если видели несколько похожих сообщений, где люди говорят, что это потому, что r => r.Id is [Модель.Рестораны] - это уровень класса, о котором уровень linq2sql не знает.Для меня это означает, что первая версия тоже не должна работать.Конечно, если мой pk является int, это работает просто отлично.

Что здесь на самом деле происходит?Видит бог, это не очень интуитивно - иметь одну работу, а другую - нет.Чего я не понимаю?

Это было полезно?

Решение

Я думаю, что проблема здесь связана с использованием перегрузки конструктора и ожиданием, что запрос заполнит его.Когда вы выполняете подобную проекцию, вы должны поместить все, что вы хотите видеть в запросе проекции, в саму фактическую проекцию.В противном случае Linq не включит это в SQL-запрос.

Итак, перепишите свои фрагменты следующим образом:

return from r in _context.Restaurants select new Restaurant()
        {
             Id=r.Id,
             Name = r.Name
        };

Это должно все исправить.

Другие советы

На самом деле вы не вводили этот код, пробовали ли вы

var results = Репозиторий.All().Где(r => r.Id.Равно(новый Guid("088ec7f4-63e8-4e3a-902f-fc6240df0a4b")).ToList()

Ниндзя

вероятно, это связано с тем фактом, что вы пытаетесь создать экземпляр guid в запросе, и я думаю, что LINQ to SQL пытается преобразовать это в фактический SQL-код до создания объекта.

Попробуйте создать экземпляр перед запросом, а не в самом запросе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top