Linq to Entities выбирает свойства из связанных объектов - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть несколько таблиц, которые правильно связаны и отображаются через таблицы FK / link.

т.е.: link_table -> отношение «1 ко многим» к table_one и table_two -> отношение «многие ко многим» к table_three

var results = db.link_table.Where(l => l.table_one.RandomProperty == "value");

Очевидно, что вышесказанное работает, но я хочу иметь возможность сделать выбор следующим образом:

var results = db.link_table.Where(l => l.table_one.RandomProperty == "value" && l.table_two.table_three.RandomProperty == "anothervalue");

Это невозможно, потому что кажется невозможным получить доступ к свойствам, которые принадлежат table_three. SQL-запрос, который я хотел бы, должен выглядеть примерно так (часть WHERE является наиболее важной):

SELECT * FROM link_table
LEFT JOIN table_one ON table_one.assoc = link_table.assoc
LEFT JOIN table_two ON table_two.assoc = link_table.assoc
LEFT JOIN table_three ON table_two.assoc = table_three.assoc
WHERE table_one.RandomProperty = "value" AND table_three.RandomProperty = "AnotherValue"

Как бы я мог получить доступ к "RandomProperty" table_three через реляционное отображение Linq2Entities? Возможно ли это даже в одной строке кода и, таким образом, получить желаемый результат в одном автоматически сгенерированном SQL-запросе?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2011

На этот вопрос дается исчерпывающий ответ: linq к сущностям, a where in where?(внутренний где) .Он включает использование команды .Any() для поиска в связанных данных таблицы «многие ко многим».

т.е.:

var results = db.link_table.Where(l => l.table_one.RandomProperty == "value" && l.table_two.table_three.Any(t => t.RandomProperty == "value"));
0 голосов
/ 24 ноября 2011

Сначала объявите все ваши свойства FK как виртуальные во всех классах модели. А затем используйте этот код: -

var results = db.link_table.Where(l => l.table_one.RandomProperty == "value" && l.table_two.table_three.RandomProperty == "value").FirstOrDefault();
...