Код: Выделить всё
public class EntityBase
{
public int Id { get; set; }
}
public class Company : EntityBase
{
public string Brand { get; set; }
public List Factories { get; set; }
}
public class Factory : EntityBase
{
public string Location { get; set; }
public Company Company { get; set; }
public List Products { get; set; }
}
public class Product : EntityBase
{
public string Name { get; set; }
public Factory Factory { get; set; }
}
- на фабрику: один ко многим
Код: Выделить всё
Company - к продукту: один ко многим
Код: Выделить всё
Factory
Например:
, ,
Означает:
- Компания с ID=3 предоставляет продукцию с ID=5 и ID=6.
- Компания с ID=7 предоставляет продукцию с ID=2
Код: Выделить всё
var companiesProducts = dbContext.Set
.SelectMany(c => c.Factories, (c, f) => new { Company = c, Factory = f })
.SelectMany(cf => cf.Factory.Products, (cf, p) => new { CompanyId = cf.Company.Id, ProductId = p.Id })
.ToList();
Если бы существовало только одно отношение «один ко многим», скажем, между Factory и Product, я мог бы представить такой метод:
Код: Выделить всё
public List GetIdPairs(
Expression subEntitySelector
) where TEntity : EntityBase where TSubEntity : EntityBase
{
var entitiesSubEntities = dbContext.Set
.SelectMany(subEntitySelector, (e, s) => new { EntityId = e.Id, SubEntityId = s.Id })
.ToList();
// Transformation from the anonymous type to (int EntityId, int SubEntityId) tuple
var idPairs = ...
return idPairs;
}
Теперь, когда у нас есть готовый метод, мы можем вызвать его следующим образом:
Код: Выделить всё
var factoryAndProductIds = GetIdPairs(f => f.Products);
Есть предложения?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ay-in-c-sh
Мобильная версия