Linq2Entities, многие ко многим и динамическое предложение where - PullRequest
3 голосов
/ 10 февраля 2010

Я довольно новичок в Linq и изо всех сил пытаюсь использовать динамические отношения между многими и многими.

Таблицы базы данных выглядят так:

Продукты <-> Products_SubCategories <-> Подкатегории

с Products_SubCategories является таблицей ссылок.

Мое полное утверждение linq:

 db.Products.Where("it.SubCategories.SubCategoryID = 2")
                   .Include("SubCategories")
                   .OrderBy(searchOrderBy)
                   .Skip(currentPage * pageSize)
                   .Take(pageSize)
                   .ToList()
                   .ForEach(p => AddResultItem(items, p));

Таким образом, игнорируя все, кроме Where() Я просто пытаюсь вытащить все продукты, связанные с подкатегорией ID 2, это невозможно с

Чтобы извлечь свойства из коллекций, вы должны использовать подзапрос для итерации по коллекции. Рядом с многочастным идентификатором, строка 8, столбец 1.

Я думаю, используя синтаксис SQL-esque, я могу сделать подзапрос согласно этой ссылке . Однако я не уверен, как это сделать в синтаксисе лямбда / цепочки.

Это начало функции поиска, и я хотел бы создать строку where динамически, как я сделал со строкой searchOrderBy, чтобы избежать большого SELECT CASE. Продукты связаны с другой таблицей через таблицу ссылок, которую мне нужно будет включить, как только я пойму, как сделать этот пример.

Любая помощь будет принята с благодарностью!

Спасибо

Ответы [ 2 ]

5 голосов
/ 10 февраля 2010

Это неправильно:

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, так как он более тестируемый.

0 голосов
/ 26 февраля 2017

у меня сработало.

db.Products.Where("SubCategories.Any(SubCategoryID = 2)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...