ASP.NET Core 2.2-简单的数据库查询问题

时间:2019-04-23 17:29:09

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.2

尝试查询数据库中的特定记录,模型中的该记录具有与其关联的ICollection。所以这是一个例子:

假设一家商店很多。

class StoreLocation {
    public int StoreId
    public string LocationName
    public ICollection<SaleItems> SaleItems
}

class SaleItems {
    public int SaleItemId
    public string ItemName
    public string ItemCost
}

因此,使用实体框架...

如何在要搜索的特定商店中搜索价格低于5美元的SaleItem?

var SaleItemsAtStore = _context.StoreLocations
.Where(location => location.StoreId == SomethingUserInputs

var CheapSaleItems = SaleItems...

....不确定该在哪里使用,否则可能我一开始就走错了方向。

1 个答案:

答案 0 :(得分:2)

您可以通过StoreLocation来执行此操作,但是这样做效率不高,因为您必须查询出所有SaleItem,然后将其过滤到内存中。

var store = await _context.StoreLocations.Include(x => x.SaleItems)
    .SingleOrDefaultAsync(x => x.StoreId == storeId);
var saleItems = store.SaleItems.Where(x => x.ItemCost < 5);

或者,更好的是,您可以显式地仅加载所需的销售商品,但是您仍然必须先查询商店,这意味着一个不必要的查询:

var store = await_context.StoreLocations.FindAsync(storeId);
var saleItems = await _context.Entry(store)
    .Collection(x => x.SaleItems).Query()
    .Where(x => x.ItemCost < 5).ToListAsync();

最好的方法是在您的SaleItem实体上拥有显式外键属性:

[ForeignKey(nameof(StoreLocation))]
public int StoreLocationId { get; set; }
public StoreLocation StoreLocation { get; set; }

然后,您可以简单地执行以下操作:

var saleItems = await _context.SaleItems
    .Where(x => x.ItemCost < 5 && x.StoreLocationId == storeId).ToListAsync();