跨多个多对多关系的 EF6 查询
EF6 Query across multiple many-to-many relationships
我有一个组模型,它与其他两个模型存在多对多关系。这里先放个简化代码帮助解释:
public class Store
{
public int ID {get; set;}
public string Name {get; set;}
public virtual ICollection<StockGroup> StockGroups { get; set; }
}
public class StockItem
public int ID {get; set;}
public string Name {get; set;}
public virtual ICollection<StockGroup> StockGroups { get; set; }
}
public class StockGroup
public int ID {get; set;}
public string Name {get; set;}
public virtual ICollection<Store> Stores { get; set; }
public virtual ICollection<StockItem> StockItems { get; set; }
}
使用 Fluent API 我在 Store 和 StockGroup 以及 StockItem 和 StockGroup 之间创建了多对多关系。这又创建了两个连接 tables.
我遇到的问题是,如果不使用 foreach 循环,我似乎无法创建从 Store 到 StockItem 或相反的查询。
例如:给定一个 StockItem,我想通过 StockGroup table 了解与其相关的所有商店。我试过这样的东西,但它返回的是一个集合的集合。
var stock = db.StockItems.Find(4);
var stores = stock.StockGroups.Select(g => g.Stores);
我如何重写它以组合 StockGroups 给我一个 Stores 集合?
谢谢!
您可以使用 SelectMany() 来展平层次结构:
var stores = stock.SelectMany(s => s.StockGroups).SelectMany(g => g.Stores).ToList();
http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/
我有一个组模型,它与其他两个模型存在多对多关系。这里先放个简化代码帮助解释:
public class Store
{
public int ID {get; set;}
public string Name {get; set;}
public virtual ICollection<StockGroup> StockGroups { get; set; }
}
public class StockItem
public int ID {get; set;}
public string Name {get; set;}
public virtual ICollection<StockGroup> StockGroups { get; set; }
}
public class StockGroup
public int ID {get; set;}
public string Name {get; set;}
public virtual ICollection<Store> Stores { get; set; }
public virtual ICollection<StockItem> StockItems { get; set; }
}
使用 Fluent API 我在 Store 和 StockGroup 以及 StockItem 和 StockGroup 之间创建了多对多关系。这又创建了两个连接 tables.
我遇到的问题是,如果不使用 foreach 循环,我似乎无法创建从 Store 到 StockItem 或相反的查询。
例如:给定一个 StockItem,我想通过 StockGroup table 了解与其相关的所有商店。我试过这样的东西,但它返回的是一个集合的集合。
var stock = db.StockItems.Find(4);
var stores = stock.StockGroups.Select(g => g.Stores);
我如何重写它以组合 StockGroups 给我一个 Stores 集合?
谢谢!
您可以使用 SelectMany() 来展平层次结构:
var stores = stock.SelectMany(s => s.StockGroups).SelectMany(g => g.Stores).ToList();
http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/