Linq для сущностей, где в where where? (внутри которого)
У меня есть таблица с отображением от одного до многих в таблицу, в которой много разных сопоставлений с другой таблицей. Я хотел бы сделать следующее:
var results = context.main_link_table
.Where(l => l.some_table.RandomProperty == "myValue" &&
l.some_table.many_to_many_table
.Where(m => m.RandomProperty == "myValue"));
Как я могу это достичь? Первая часть будет работать, но, пытаясь ее без "внутреннего ГДЕ", я не могу получить доступ к свойствам many_to_many_table, но "внутреннее пространство", очевидно, не будет компилироваться. Я в основном хочу добиться чего-то вроде следующего SQL-запроса:
SELECT * from main_link_table
INNER JOIN some_table AS t1 ON t1.association = main_link_table.association
INNER JOIN many_to_many_table AS t2 ON t2.association = some_table.association
WHERE t1.RandomProperty = 'MyValue' AND t2.RandomProperty = 'MyValue'
Похоже, это просто, но я не могу найти способ добиться этого в одной строке linq - использование нескольких строк для достижения желаемого эффекта возвращает слишком много результатов, и я в конечном итоге вынужден их перебирать. Я также пробовал такие вещи, как:
var results = main_link_tbl.Include("some_table.many_to_many_table")
.Where(l => l.some_table.many_to_many_table.<property>
== "MyValue")
Но в этот момент я не могу выбрать свойство many_to_many_table, если я не добавлю FirstOrDefault(), который аннулирует эффект, поскольку он не будет выполнять поиск по всем записям.
Что работало, но требует нескольких строк кода и в фоновом режиме возвращает слишком много результатов в SQL-запросе, создаваемом инфраструктурой linq-to-entities:
var results = db.main_link_table.Include("some_table")
.Include("some_table.many_to_many_table")
.Where(s => s.some_table.RandomProperty
== "myValue")
.Select(s => s.some_table);
foreach(var result in results) {
var match_data = result.Where(s => s.many_to_many_table.RandomProperty
== "myValue");
}
Этот кусок кода вернет все строки внутри some_table, которые соответствуют первому условию Where, а затем применит следующее условие Where, в то время как мне, очевидно, нужна только одна строка, где параметр many_to_many_table.RandomProperty равен myValue.
Ответы
Ответ 1
Он должен работать, если вы измените внутренний Where
на Any
:
var results = context.main_link_table
.Where(l => l.some_table.RandomProperty == "myValue" &&
l.some_table.many_to_many_table
.Any(m => m.RandomProperty == "myValue"));
Ответ 2
Если вы хотите сделать соединение, почему бы вам просто не присоединиться к нему?
var query = from main in context.MainLinks
join t1 in context.Some on main.Association equals t1.Association
where t1.RandomProperty == "MyValue"
join t2 in context.ManyToMany on t1.Association equals t2.Association
where t2.RandomProperty == "MyValue"
select new { main, t1, t2 };
Это должно достичь именно того, что делает ваш SQL...
Ответ 3
from link in db.main_link_table
join s in db.some_table on link.association1 = s.association
join m in db.many_to_many_table on link.association2 = m.association
where s.X = 'MyValue' AND m.Y = 'MyValue'
select m; // or s or link or both 3 as you want