Синтаксис метода LinQ для нескольких таблиц с .where () и без объединений

1

Как получить данные из нескольких таблиц с синтаксисом метода без использования объединений, но только методы.where()?

Я делаю выбор против контекста EF5 db, который сопоставляется с этой старой структурой таблицы, где у меня есть таблица подробностей лиц и другая таблица, которая ссылается как на себя, так и на создание иерархии и таблицы данных человека:

PersonSet 
.Where(p => p.LastName.ToLower()=="surname")
.Join(SubsetSet, p => p.Id, ss => ss.SubsetLink, (p, ss) => new { PersonDetail = p, person = ss })
.Where(m => m.person.Frame=="a" && m.person.Purpose=="1")
.Join(SubsetSet, ss1 => ss1.person.Owner, person => person.SubsetLink, (ss1, ss2) => new { person = ss1, club = ss2 })
.Where(a => a.club.Frame=="b" && a.club.Purpose=="2")
.Join(SubsetSet, ss => ss.club.Owner, ss2 => ss2.SubsetLink, (ss, ss2) => new { club = ss, association = ss2 })
.Where(a => a.association.Frame=="b" && a.association.Purpose=="3")
.Join(SubsetSet, ss => ss.association.Owner, ss3 => ss3.SubsetLink, (ss, ss3) => new { association = ss, district = ss3})
.Where(d => d.district.Frame=="b" && d.district.Purpose=="4" && d.district.SubsetLink=="12345")
.Select(proj => new { proj.association.club.person, proj.association.club, proj.association, proj.district })
.OrderByDescending(a => a.association.club.person.phyperson.FirstName) 
.Take(10).Dump();

Вышеупомянутый запрос работает, по крайней мере, в LinqPad, но, мне кажется, что, если бы я мог избавиться от этих объединений, оператор выглядел бы немного лучше. Теперь я знаю, как в приведенном ниже примере Albahari, что это можно сделать с помощью синтаксиса запроса. Но я не мог найти пример, который бы проиллюстрировал эту ситуацию синтаксисом метода. Конечно, я пытаюсь приблизиться к этому, конечно, ошибаюсь, и поэтому я не могу найти подходящие примеры.

Здесь я нашел нечто похожее, но не смог заставить его работать в LinQPad: Является ли несколько операторов Where () в LINQ проблемой производительности?

Или этот, где решение снова находится в синтаксисе запроса: Cross Join with Where where

Или этот пример Альбахари: (http://www.linqpad.net/WhyLINQBeatsSQL.aspx)

from p in db.Purchases 
where p.Customer.Address.State == "WA" || p.Customer == null 
where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000 
select p
  • 2
    Обычно каждая сущность имеет свойство соединения с другой сущностью, то есть в вышеприведенном примере «Албахари» Purchase имеет Customer который ссылается на конкретного покупателя, который купил покупку. У вашей сущности есть такие?
  • 0
    Это навигационные свойства Customer и PurchaseItems в примере ALbahri. Если у вашей сущности есть навигационные свойства, вы не должны использовать соединение, чтобы связать их со своей сущностью.
Показать ещё 2 комментария
Теги:
linq
lambda
entity-framework-5

1 ответ

1
Лучший ответ

Рассмотрим этот запрос:

var q = from order in orders
        from orderline in order.Lines
        where orderline.Count > 10
        select order.Discount * orderline.Price;

это более или менее соответствует

var q = orders
    .SelectMany(order => order.Lines, (order, orderline) => new { order, orderline})
    .Where(item => item.orderline.Count > 10)
    .Select(item => item.order.Discount * item.orderline.Price);

Дополнительные сведения о SelectMany см. В документации MSDN.

Если у вас нет определенных ассоциаций:

var q = from order in orders
        from orderline in orderLines
        where orderline.OrderId == order.Id
        where orderline.Count > 10
        select order.Discount * orderline.Price;

это более или менее соответствует

var q = orders
    .SelectMany(order => orderLines, (order, orderline) => new { order, orderline})
    .Where(item => item.orderline.OrderId == item.order.Id)
    .Where(item => item.orderline.Count > 10)
    .Select(item => item.order.Discount * item.orderline.Price);
  • 0
    Я думаю, это могло бы быть ответом, если бы у меня были определенные ассоциации между сущностями. Но так как я этого не сделаю, мне придется использовать оригинальный подход, который у меня уже был. Спасибо, в любом случае!
  • 0
    @Lupa Обновлен ответ, чтобы было более понятно, что этот метод можно использовать и тогда, когда ассоциации не определены.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню