选择没有产品库存的类别

时间:2012-01-06 15:50:30

标签: c# linq entity-framework entity-relationship iqueryable

我试图绕过Linq查询,只有在所有子对象都包含特定属性时才返回父对象。

即,例如,返回与该类别相关联的所有产品都有product.Inventory == 0

的类别

此Q的其他标题:
选择ParentObject,其中所有ChildObjects都具有特定的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 个答案:

答案 0 :(得分:2)

var categoriesWithNoInventory =
    Categories.Where(c => c.Products.All(p => p.Inventory == 0));

答案 1 :(得分:1)

假设您的课程看起来像这样

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));

答案 2 :(得分:0)

我认为你必须做2个查询?第一个抓住子产品,然后检查库存,或者我想你可以通过加入来做,这是一个加入示例:http://www.dotnetperls.com/join

答案 3 :(得分:0)

为我的问题找到了一个解决方案,但是再过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会过滤掉。)