#.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 для объектов, которые считаются беспорядочными, избыточными, очень четко объясняет концепцию.