Это неправильно:
db.Products.Where("it.SubCategories.SubCategoryID = 2")
SubCategories
- это список. У него нет свойства с именем SubCategoryID
. Скорее, он содержит группу сущностей, каждая из которых имеет свойство с именем SubCategoryID
. Это критическое различие.
Когда вы сталкиваетесь с ситуацией, когда вы не знаете, как поступить, возникает множество проблем, хорошо разбить проблему на несколько более мелких проблем.
Давайте начнем с удаления динамического запроса. Будет проще решить проблему с нединамическим запросом. Как только вы это сделаете, вы можете вернуться и снова сделать его динамичным.
Итак, начните с использования нединамического синтаксиса. Введите что-то подобное в Visual Studio и посмотрите, что IntelliSense сделает для вас:
db.Products.Where(p => p.SubCategories.
Вы быстро увидите, что свойства SubCategoryID
нет. Вместо этого вы увидите несколько методов LINQ API для работы со списками. Если вы хорошо знаете LINQ, вы поймете, что вам нужен метод Any()
:
db.Products.Where(p => p.SubCategories.Any(sc => sc.SubCategoryID == 2))
Продолжайте и выполните этот запрос. Это работает? Если это так, вы можете двигаться вперед, чтобы сделать его динамичным. Я не эксперт по ESQL, но я бы начал с чего-то вроде:
db.Products.Where("EXISTS(SELECT SC FROM it.SubCategories AS SC WHERE SC.SubCategoryID = 2");
Кроме того, я использую MS Dynamic Query ("Dynamic LINQ") для такого рода вещей, а не Query Builder, так как он более тестируемый.