Linq2Entities, многие ко многим и динамическое предложение where

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

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

Товары ‹-> Товары_Подкатегории ‹-> Подкатегории

где 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(), я просто пытаюсь вытащить все продукты, которые связаны с идентификатором подкатегории 2, это не удается с

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

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

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

Любая помощь приветствуется!

Спасибо


person Jammin    schedule 10.02.2010    source источник


Ответы (2)


Это не верно:

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, так как его легче тестировать.

person Craig Stuntz    schedule 10.02.2010
comment
Спасибо, Крейг, ясная консистенция и хорошая работа. Я загнал себя в угол! Я довольно сильно изменил реализацию, включив поиск FT через SP, но это помогло моему пониманию. - person Jammin; 11.02.2010
comment
Отличный ответ, именно то, что я искал - person januszstabik; 19.11.2010

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

db.Products.Where("SubCategories.Any(SubCategoryID = 2)")
person ali-myousefi    schedule 26.02.2017