linq к юридическим лицам, а где в где пункт? (внутренний где) - PullRequest
11 голосов
/ 24 ноября 2011

У меня есть таблица с отображением «один ко многим» на таблицу, в которой таблица «многие ко многим» отображается на другую таблицу.Я хотел бы сделать следующее:

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"));

Как мне этого добиться?Первая часть будет работать, но при попытке без «внутреннего WHERE» я не могу получить доступ к свойствам 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-entity:

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.

Ответы [ 3 ]

19 голосов
/ 24 ноября 2011

Должно работать, если вы измените внутренний 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"));
5 голосов
/ 24 ноября 2011

Если вы хотите присоединиться, почему бы вам просто не присоединиться?

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 ...

1 голос
/ 24 ноября 2011
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
...