Выберите категории, где ни один продукт не имеет инвентаря - PullRequest
1 голос
/ 06 января 2012

Я пытаюсь обернуть голову вокруг запроса Linq, чтобы вернуть родительский объект, только если все дочерние объекты содержат определенное свойство.

Т.е., например, возвращать категории, в которых все продукты связаны с этой категориейиметь product.Inventory == 0

Другие заголовки для этого Q:
Выберите ParentObject, где все дочерние объекты имеют конкретное значение ChildObject.Parameter

РЕДАКТИРОВАТЬ:
В дополнение к связи, я также толькохотите получить категорию, если одно из ее свойств даты не равно нулю.

РЕДАКТИРОВАТЬ:
Вот один из примеров, которые я ранее пытался:

var selectQuery = 
   (from statementDetail in pcardDatabaseContext.PCardStatementDetails
    where statementDetail.ExportedDate != null
    && statementDetail.PCardTransactions.All(txn => txn.TransactionStatusID == txnStatusAccountingApproved)
    orderby statementDetail.ExportedDate
    select statementDetail) as IOrderedQueryable<PCardStatementDetail>;

РЕДАКТИРОВАТЬ:
Нашел решение для моей проблемы, но не могу ответить самостоятельно в течение еще 7 часов.

Я частично испытывал некоторые проблемы с более ранним синтаксисом, я предполагал, что при использовании x.All значения не будут 'не возвращает никакого совпадения, если набор был пуст.

Вот что решило это для меня:

var selectQuery =
   (from statementDetail in pcardDatabaseContext.PCardStatementDetails
    where statementDetail.ExportedDate == null
    && statementDetail.PCardTransactions.All(txn => txn.TransactionStatusID == txnStatusAccountingApproved)
    && statementDetail.PCardTransactions.Any()
    orderby statementDetail.ExportedDate
    select statementDetail) as IOrderedQueryable<PCardStatementDetail>;

Обратите внимание, что я изменил ExportDate, чтобы получить только ExportedDate == NULL.Кроме того, мне пришлось добавить .Any, в противном случае я получал записи, в которых не было транзакций (где я думал, что .All отфильтрует).

Ответы [ 4 ]

2 голосов
/ 06 января 2012
var categoriesWithNoInventory =
    Categories.Where(c => c.Products.All(p => p.Inventory == 0));
1 голос
/ 06 января 2012

Если ваши классы выглядят примерно так

public class Category
{
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}

public class Product
{
    public string Name { get; set; }
    public int Inventory { get; set; }
}

, тогда это будет работать (AllCategories () возвращает IEnumerable<Category>)

var categories = AllCategories().Where(c => c.Products.All(p => p.Inventory == 0));
0 голосов
/ 09 января 2012

Нашел решение для моей проблемы, но не могу ответить самостоятельно еще 7 часов.

У меня частично возникали некоторые проблемы с более ранним синтаксисом, я предполагал, что при использовании x.All значения не будут возвращать никакого совпадения, если набор пуст.

Вот что для меня решило:

var selectQuery =
   (from statementDetail in pcardDatabaseContext.PCardStatementDetails
    where statementDetail.ExportedDate == null
    && statementDetail.PCardTransactions.All(txn => txn.TransactionStatusID == txnStatusAccountingApproved)
    && statementDetail.PCardTransactions.Any()
    orderby statementDetail.ExportedDate
    select statementDetail) as IOrderedQueryable<PCardStatementDetail>;

Обратите внимание, что я изменил ExportDate, чтобы получить только ExportedDate == NULL. Кроме того, мне пришлось добавить .Any, в противном случае я получал записи, в которых не было транзакций (где я думал, что .All отфильтрует).

0 голосов
/ 06 января 2012

Я думаю, вам нужно будет сделать 2 запроса?сначала захватить дочерние продукты, а затем проверить инвентарь, или, я полагаю, вы можете сделать это с помощью объединения, вот пример объединения: http://www.dotnetperls.com/join

...