2016-04-27 60 views
0

我想创建一个linq语句来使用any子句过滤otu结果。我的问题是我没有单一的价值来比较。linq任何从多个值的子句

在下面的示例中,我有一个PropertyTaxBill实体,它是父级实体。每个人都有一系列TaxPropertyAssessmentDetails附加到它。

在这个查询中,人们可以指定他们只想处理与特定类层有关的账单,所以我检查是否有任何值存在于classStrata变量中。如果是这样,那么用户选择特定的。我试图在classStrata上做任何一个子句,但不是给它一个匹配的值,而是试图选择PropertyTaxBill附加的TaxPropertyAssessmentDetails集合中的所有值。这可能吗?

using (var dataContext = contextProvider.GetContext()) 
{ 

    var query = dataContext.PropertyTaxBills.Where(x => x.Id > 1); 
    var classStrata = new int[0]; 

    if (classStrata != null && classStrata.Any()) 
    { 
     query = query.Where(x => classStrata.Any(y => y == x.TaxPropertyAssessmentDetails.SelectMany(z => z.PropertyTaxClassStrataId))); 
    } 
} 
+0

我确实不能图片我会需要一个谓词来处理内部的任何这种情况。你可以发表一个例子吗? –

+2

'classStrata.Any(y => x.TaxPropertyAssessmentDetails.Any(z => z.PropertyTaxClassStrataId == y))''。甚至更好'x => x.TaxPropertyAssessmentDetails.Any(z => classStracta.Contains(z.PropertyTaxClassStrataId))' –

+0

这很好。谢谢 –

回答

0

您需要使用包含,以便ef能够转换为ef查询。 不确定我是否正确理解你的模型。这是一个模型的例子。请告诉我,如果我理解错误,我可以修复它。

public void TestMethod1() 
{ 
    IEnumerable<TaxBill> TaxBills = new List<TaxBill>(); 

    var query = TaxBills.Where(x => x.Id > 1); 
    var classStrata = new int[0]; 

    if (classStrata != null && classStrata.Any()) 
    { 
     query = query.Where(x => x.AssessmentDetails.Any(ad => ad.TaxClassStrataId.Any(cs => classStrata.Contains(cs)))); 
    } 
} 

而且实体

public class TaxBill 
{ 
    public int Id { get; set; } 
    public ICollection<AsessmentDetails> AssessmentDetails { get; set; } 
} 
public class AsessmentDetails 
{ 
    public ICollection<int> TaxClassStrataId { get; set; } 
}