#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 не выполняет предварительную фильтрацию, как я думаю).