Linq-запрос с двумя отношениями многие-многие - PullRequest
0 голосов
/ 11 июля 2011

У меня настроены следующие объекты, которые я пытаюсь запросить:

  • Store
  • StoreCapability.У магазина может быть несколько возможностей (например, продает шоколад, он большой), но не обязательно иметь какие-либо.
  • Предложения.Предложение может потребовать возможности нескольких магазинов для того, чтобы быть действительным, но никаких требований не требуется.

Store -[m2m]- StoreCapability -[m2m]- Offer

Таким образом, задействовано пять таблиц.

Я хотел бы иметь возможность получить следующее с помощью linq:

  • При наличии предложения, списка магазинов, для которого оно действительно
  • При наличии магазина, списка доступных предложений

Используя SQL, можно было бы присоединиться из Store, к StoreCapability, Offer, а затем сгруппировать по предложениям и store и получать только те магазины, у которых count () равен числу требований, предъявляемых предложением,Однако я не знаю, с чего начать с Linq, потому что многие-многие таблицы скрыты от меня платформой Entity.Пожалуйста, кто-нибудь может помочь с тем, как я могу это сделать?

SQL может выглядеть примерно так:

SELECT Offers.Id, offers.Name, Stores.Id, Stores.Name FROM Offers
--join to the capabilities that this offer needs
LEFT OUTER JOIN StoreCapabilityOffers offerRequirements ON Offers.Id = offerRequirements.Offer_Id
--join to stores which have capability
LEFT OUTER JOIN StoreCapabilities ON offerRequirements.StoreCapability_Id = StoreCapabilities.Id
--join to stores
LEFT OUTER JOIN StoreStoreCapabilities storeCap ON offerRequirements.StoreCapability_Id = storeCap.StoreCapability_Id
LEFT OUTER JOIN Stores on storeCap.Store_Id = Stores.Id

GROUP BY Offers.Id, offers.Name, Stores.Id, Stores.Name
-- get stores who have the right number of capabilities so all requirements are all met
HAVING COUNT(*) = (
    select COUNT(*) from StoreCapabilityOffers x where x.Offer_Id = Offers.Id
)

Объекты ниже:

public class Store
{
  public int Id { get; set; }
  public virtual ICollection<StoreCapability> Capabilities { get; set; }
}

public class StoreCapability
{
  public int Id { get; set; }
  public virtual ICollection<Store> Stores { get; set; }
  public virtual ICollection<Offer> Offers { get; set; }
}

public class Offer
{
  public int Id { get; set; }
  public virtual ICollection<StoreCapability> StoreCapabilityRequirements { get; set; }
}

1 Ответ

1 голос
/ 11 июля 2011

Я думаю, что-то вроде этого должно работать:

Учитывая предложение, список магазинов, для которых оно действительно:

var stores = from o in context.Offers
             from c in o.StoreCapabilityRequirements
             from s in c.Stores
             where o.Id == 1
             select s;

При наличии магазина список доступных предложений:

var offers = from s in context.Stores
             from c in s.Capabilities
             from o in c.Offers
             where s.Id == 1
             select o;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...