Linq для объектов с двумя таблицами

#.net #linq #entity-framework

#.net #linq #entity-framework

Вопрос:

Когда вы пишете запрос linq, который включает две таблицы / объекты, для которых вы уже определили связь в своей модели данных entity framework, нужно ли вам определять соединение в запросе или существует другой синтаксис, который использует уже определенную связь?

 var q =

    from c in categories

    join p in products on c equals p.Category into ps

    select new { Category = c, Products = ps };
  

В противном случае, какой смысл определять отношения в модели EF?

Ответ №1:

Если все настроено правильно, у вас будет ссылочное свойство, которое представляет связь с внешним ключом, и в этом случае вы сможете сделать что-то вроде:

 var q = from c in categories
        select new {Category = c, Products = c.Products};
  

Комментарии:

1. У меня настроено свойство навигации между моими двумя объектами, но отношение равно 1 > 0 .. 1, и когда я пытаюсь написать любой тип запроса linq, включающий два, он выдает сообщение об ошибке, в котором говорится «Ошибка вывода типа при вызове ‘SelectMany'». Я делаю что-то неправильно, читая ошибку, было предложено использовать ссылку на объект, но я не знаю, правда ли это?

2. @suggy1982 Можете ли вы опубликовать пример запроса LINQ в своем вопросе?

3. объекты отличаются от моего первоначального вопроса, объектом поставщиков является PK, а объектом DirectSupplier является FK. Я хочу вернуть поставщиков, которые являются прямыми поставщиками. VS подчеркивает «s.DirectSupplier» с ошибкой «Выражение типа ‘TransactionScopeTest.DirectSupplier’ не разрешено в последующем предложении from в выражении запроса с исходным типом ‘System.Data.Objects. ObjectSet<TransactionScopeTest.Supplier>’. Ошибка вывода типа при вызове ‘SelectMany'» var q = (из s в db.Поставщики из d в s.DirectSupplier выбирают d);

4. @suggy1982 Итак, у вас есть связь «один ко многим» между поставщиками и DirectSuppliers, но у вас нет ссылочного свойства, поэтому вы можете просто выполнить запрос типа «var q = from s in db.Поставщики выбирают s.DirectSupplier»?

5. Да, отношение «один ко многим» и да, существует ссылочное свойство. Я просто неправильно понял синтаксис. Предоставленный вами синтаксис сработал. Спасибо:-D

Ответ №2:

У вас должно быть свойство навигации в вашем объекте Category с именем Products , которое содержит все связанные объекты Product, вы должны использовать это вместо выполнения соединения вручную.

Комментарии:

1. Спасибо, я проверю настройки в моей модели.

2. У меня настроено свойство навигации между моими двумя объектами, но отношение равно 1 > 0 .. 1, и когда я пытаюсь написать любой тип запроса linq, включающий два, он выдает сообщение об ошибке, в котором говорится «Ошибка вывода типа при вызове ‘SelectMany'». Я делаю что-то неправильно, читая ошибку, было предложено использовать ссылку на объект, но я не знаю, правда ли это?

Ответ №3:

Я нахожу, что это сообщение в блоге join в LINQ для SQL и LINQ для объектов, которые считаются беспорядочными, избыточными, очень четко объясняет концепцию.