2016-11-18 5 views
0

У меня есть отношения между 3 таблицы, как этотLINQ Регистрация возвращения IQueryable

enter image description here

Я хочу есть метод, который дал параметр типа table1 и DbContext я получаю все связанные строки из Table3 проходящие через table2

Вот моя реализация

public static IQueryable<table3> GetRows(
    EntitiesContext context, 
    table1 row) 
{ 
    var table3Rows = 
    from t2 in row.table2 
    join t3 in context.table3 on t2.IdTable3 equals t3.Id 
    select t3; 

    return table3Rows; 
} 

Проблема такого подхода заключается в том, что я не могу вернуться table3Rows потому что IEnumerable не IQueryable.

Есть ли обходной путь для возврата IQueryable при использовании присоединиться?

Мне нужен IQueryable, потому что я планирую сделать некоторые другие запросы против результата.

+0

Проверить этот пост - https://blog.hompus.nl/2010/08/26/joining-an-iqueryable-with-an-ienumerable/#gs.CQPGsx4 – SilentCoder

ответ

5

Вы не сможете использовать свойство навигации, если у вас уже есть материализованный объект Table1. Если у вас есть IQueryable<Table1>, вы можете использовать общий подход, который вы используете, и результатом будет, естественно, IQueryable<Table3>.

Поскольку у вас есть материализованная строка таблицы, вам нужно запросить БД для объектов Table2, а не использовать свойство навигации.

public static IQueryable<table3> GetRows(
    EntitiesContext context, 
    table1 row) 
{ 
    var table3Rows = 
    from t2 in context.table2 
    where row.Table2Id == t2.Id 
    from t3 in t2.Table3 //here we can use a navigation property, since it's not on a materialized object. 
    select t3; 

    return table3Rows; 
} 
+0

Это не компилируется. –

+1

@TamasIonut Почему бы и нет? Очевидно, я сделал несколько предположений о схеме OP, которые, возможно, необходимо скорректировать на основе его конкретных имен, но здесь важно, что здесь важно, и это не является недостатком. – Servy

+0

ключевое слово «on» после первого «от» –

Смежные вопросы