Объединение Entity Framework с частично жестко запрограммированным «включено» из-за пары ключ-значение?

#entity-framework

#entity-framework

Вопрос:

Итак, у меня есть это:

 db.Table1
  .Join(db.Table2, t1 => t1.id, t2 => t2.id, (t1, t2) => new { t1, t2 })
 

Но что мне нужно сделать, так это присоединиться к таблице значений атрибутов / значений ключей, а также для определенного атрибута, например:

 SELECT * FROM Table1 t1
  JOIN Table2 t2 ON t1.id = t2.id AND t2.attributeid = 123
 

Как мне квалифицировать эту часть attributeid = 123?

Ответ №1:

Одного Where пункта должно быть достаточно:

 db.Table1
    .Join(db.Table2, t1 => t1.id, t2 => t2.id, (t1, t2) => new { t1, t2 })
    .Where(x => x.t2.attributeId == 123);
 

В идеале таблица 1 должна иметь свойство навигации к таблице 2: (либо hasOne, либо hasMany)

Сингулярная Таблица2:

 var result = db.Table1
    .Include(x => x.Table2)
    .Where(x => x.Table2.AttributeId == 123);
 

или для набора таблиц2…

 var result = db.Table1
    .Include(x => x.Table2s)
    .Where(x => x.Table2s.Any(t2 => t2.AttributeId == 123);
 

который вернул бы любую Таблицу1, содержащую Таблицу2 с этим атрибутом…

или с коллекцией, которую вы хотите отфильтровать Table2s:

 var result = db.Table1
    .Where(x => x.Table2s.Any(t2 => t2.AttributeId == 123)
    .Select(x => new 
    {
        Table1 = x,
        FilteredTable2s = x.Table2s.Where(t2 => t2.AttributeId == 123).ToList()
    });
 

Комментарии:

1. Я думаю, что я собираюсь с чего. Я подумал, может быть, существует эквивалент ON, где он мог бы предварительно отфильтровываться до того, как он попадет в предложение where, но, возможно, нет (может быть, даже так, что ON не выполняет предварительную фильтрацию, как я думаю).