ASP.NET Core 2.2 - простой вопрос к БД - PullRequest
0 голосов
/ 23 апреля 2019

Пытаясь запросить у БД конкретную запись, с этой записью в модели связана коллекция ICollection.Итак, вот пример:

Допустим, у нас есть несколько магазинов:

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

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

Итак, используя каркас сущностей ...

Как я могу искать SaleItems дешевле$ 5 в конкретном магазине, который ищут?

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

var CheapSaleItems = SaleItems...

.... не знаете, куда пойти с этим, или, может быть, я иду в совершенно неправильном направлении, с чего начать.

1 Ответ

2 голосов
/ 23 апреля 2019

Вы можете сделать это через 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...