由于Market.Dealers属性只是一个导航,需要单独加载dealer。但是在这种情况下,每个Dealer也有Market作为导航属性,您可以查询到Dealer,包括Market,然后再按Market分组。像这样:
using (var db = new MyContext())
{
// this is important since Market.Dealers is a navigation property,
// without this it would load all dealers in the market.
db.Configuration.LazyLoadingEnabled = false;
// load all dealers and its market(using Include)
// by specific marketId and dealerId.
var dealers = db.Dealers
.Include(o => o.Market)
.Where(o => o.DealerId == dealerId && o.Market.Id == marketId)
.ToList();
// this will be executed in the client-side,
// so you don't need to worry about round-trip overhead.
var markets = dealers
.GroupBy(o => o.Market)
.Select(o => o.Key)
.ToList();
Console.WriteLine("Check if all dealers also have market: " +
markets.SelectMany(o => o.Dealers).All(o => o.Market != null));
Console.WriteLine("All dealers in the markets: " +
markets.SelectMany(o => o.Dealers).Count());
}
如果您不喜欢设置配置或编写额外代码(本例中为分组),您可以将市场信息和经销商投影为匿名对象。但是这种方法不能在每个 Dealers 上保留对 Market 属性的引用。
using (var db = new MyContext())
{
var anonymousMarkets = db.Markets
.Where(o => o.MarketId == marketId)
.Select(o => new // project as an anonymous object
{
o.MarketId,
o.Description,
Dealers = o.Dealers.Where(d => d.DealerId == dealerId)
})
.ToList();
Console.WriteLine("Check if all dealers don't have market: " +
anonymousMarkets.SelectMany(o => o.Dealers).All(o => o.Market == null));
Console.WriteLine("All dealers in the markets: " +
anonymousMarkets.SelectMany(o => o.Dealers).Count());
}
最后,如果您想在每个 Dealers 上保留 Market 导航属性,您可以将 Market 和 Dealers 聚合在一起。
using (var db = new MyContext())
{
var marketAggregates = db.Markets.Where(o => o.MarketId == marketId)
.Select(o => new // aggregate Market and Dealers as an anonymous object.
{
Market = o,
Dealers = o.Dealers.Where(d => d.DealerId == dealerId)
})
.ToList();
Console.WriteLine("Check if all dealers also have market: " +
marketAggregates.SelectMany(o => o.Dealers).All(o => o.Market != null));
Console.WriteLine("All dealers in the markets: " +
marketAggregates.SelectMany(o => o.Dealers).Count());
}
嗯,所有方法都有不同的优缺点,但我通常更喜欢最后一种。