繁体   English   中英

Linq-to-SQL查询列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM