linq для сущностей, а пункт where in where? (inner where)

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

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, но «внутреннее где» явно выиграет » t компилировать.Я в основном хочу получить что-то вроде следующего 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.

12
задан abatishchev 8 June 2012 в 14:59
поделиться