【问题标题】:Entity Framework Select Query实体框架选择查询
【发布时间】:2015-08-18 17:49:20
【问题描述】:

我有以下课程:

public class Seller : Entity
{
    public int SellerId { get; set; }
    public string Name { get; set; }

    public ICollection<InventoryItem> InventoryItems { get; set; }
}

public class InventoryItem : Entity
{
    public int InventoryId { get; set; }
    public int SellerId { get; set; }
    public string SellerSku { get; set; }

    public ICollection<SiteInventoryItem> SiteInventoryItems { get; set; }
}

public class SiteInventoryItem : Entity
{
    public int Id { get; set; }
    public int InventoryId { get; set; }
    public SiteType Site { get; set; }
}

所以Seller 拥有InventoryItem 的集合,而InventoryItem 又拥有SiteInventoryItem 的集合。

如何获得带有InventoryItems 列表的Seller,其中SiteInventoryItems 列表中的SiteType == SiteType.SiteNameSeller.SellerId == 14

SiteTypeEnum,db 类型是 int

我尝试了以下方法,它编译并运行,但结果不是预期的:

var seller = repo.Query(
                x => x.InventoryItems,
                x => x.InventoryItems.Select(y => y.SiteInventoryItems)
            ).Select(x => new
            {
                Seller = x,
                InventoryItems = x.InventoryItems,
                SiteInventoryItems = x.InventoryItems.Select(y => new
                {
                    InventoryItem = y,
                    SiteInventoryItems = y.SiteInventoryItems.Where(z => z.Site == SiteType.Amazon)
                })
            }).Where(x => x.Seller.SellerId == 14).First();

【问题讨论】:

  • 您需要一个Seller,它的InventoryItems 集合至少包含一个InventoryItem,它至少有一个具有适当值的SiteInventoryItem
  • @haim770 - 我需要一个SellerInventoryItem 的集合,然后每个人都有一个SiteInventoryItem 的集合,约束是Seller.SellerId == 14SiteInventoryItem.Site == 1
  • “一点运气都没有”是什么意思?它编译吗?它运行吗?它会返回结果吗?
  • @CodeCaster - 它编译并运行,但结果不是预期的。
  • 你期待什么,结果是什么?

标签: c# entity-framework


【解决方案1】:
var seller = repo.Query()
        .Select(x => new
        {
            Seller = x,
            InventoryItems = x.InventoryItems.Select(y => new
            {
                InventoryItem = y,
                SiteInventoryItems = y.SiteInventoryItems.Where(z => z.Site == SiteType.Amazon)
            }).Where(y => y.SiteInventoryItems.Any())
        }).Where(x => x.Seller.Id == 14).First();

我对结果类型进行了一些重组,因为我认为这样更有意义。现在您看到结果只返回具有InventoryItemsSiteInventoryItemsSellers。

请注意,我还删除了 repo.Query() 的参数。我假设他们充当Includes。但我也希望repo.Query()返回一个IQueryable,这样Where子句就会被翻译成生成的SQL。如果是这样,Includes 就没用了,因为您已经在查询包含的实体,因为它们是匿名类型的一部分。

【讨论】:

  • 这个剧照返回所有的InventoryItem,不管他们是否有SiteInventoryItem
  • 我明白了,条件应该更深一层(命名有点难以捉摸)。
  • 仍然得到相同的结果。
  • 现在甚至无法编译。
  • 好的,我更新了答案,你非常接近,它让我朝着正确的方向前进,感谢你的努力!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2021-12-25
  • 2013-03-17
  • 2014-02-24
相关资源
最近更新 更多