IQueryable, где, Guid и - PullRequest
       15

IQueryable, где, Guid и

0 голосов
/ 01 мая 2009

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

В моем случае первичный ключ - это уникальный идентификатор вместо поля int. Репозиторий возвращает IQueryable:

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

В этом случае Ресторан - это, конечно, Ресторан. Ресторан, а не _контекст. Ресторан. Ресторан.

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

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

Это прекрасно работает, есть один Model.Restaurant. Теперь, если я попробую то же самое с 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 - это [Model.Restaurants] - это уровень класса, о котором слой linq2sql не знает. Для меня это означает, что первая версия тоже не должна работать. Конечно, если мой pk - int, он работает просто отлично.

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

Ответы [ 3 ]

0 голосов
/ 01 мая 2009

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

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

0 голосов
/ 08 мая 2009

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

Итак, переписать свои биты так:

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

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

0 голосов
/ 01 мая 2009

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

var results = Repository.All (). Где (r => r.Id.Equals (новый Guid ("088ec7f4-63e8-4e3a-902f-fc6240df0a4b")). ToList ()

Ninja

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