[英]Linq-to-SQL query a list
这很可能非常简单,只是我无法使其正常工作。
我有2个C#类:
市场
public string MarketId { get; set; }
public string Description { get; set; }
public virtual List<Dealer> Dealers { get; set; }
零售商
public string DealerId { get; set; }
public string City { get; set; }
public Market Market { get; set; }
我想要做的是获得一个或多个特定市场(marketid),并且仅获得与(dealerid)匹配的经销商。 可以是多个匹配项。
我尝试了这个:
dbMarkets = db.Markets.Where(x => x.MarketId.Equals(marketId) && x.Dealers.Select(c => c.DealerId).Contains(dealerId)).ToList();
但是,该人返回的是属于市场的所有经销商,而不仅仅是返回与Dealerid相匹配的经销商。
由于Market.Dealers
属性只是一个导航,因此您需要分别加载经销商。 但是在这种情况下,每个Dealer
都具有Market
作为导航属性,您可以先向Market
询问Dealer
,然后再按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());
}
如果您不想设置配置或编写额外的代码(在这种情况下为分组),则可以将市场信息和经销商投影为匿名对象。 但是这种方法不能在每个经销商上保留对市场属性的引用。
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());
}
最后,如果要在每个经销商上保留市场导航属性,则可以将市场和经销商汇总在一起。
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());
}
嗯,所有方法都各有利弊,但我通常更喜欢最后一种方法。
符合以下条件的东西:
db.Markets
.Where(o => o.MarketId.Equals(marketId))
.Select(o => new Market{
MarketId = o.MarketId,
Description = o.Description,
Dealers = db.Dealers.Where(k => k.DealerId == o.Dealers).ToList()
})
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.