当属性是列表时,如何通过其proterty的特定值查询表?

时间:2013-09-23 06:43:48

标签: c# entity-framework filtering navigation-properties

我有一个名为QuoteQuoteInfo的班级。 Quote班级的List QuoteInfo。像这样:

public class Quote
{   
    ...
    public virtual List<QuoteInfo> QuoteInfo { get; set; }
    ...
}

我的QuoteInfo类也有Language属性。像这样:

public class QuoteInfo
{
    ...
    public virtual Language Language { get; set; }
    ...
}

正如您在我查询Quotes时所看到的那样......

    var quotes = dbContext.Quotes.ToList();

...所有QuoteInfo都带有它(当然启用了延迟加载)。但我只是希望用特定的语言获得QuoteInfo。我怎么能在一个查询中这样做?

提前致谢。

编辑:例如我有一个带有2个QuoteInfos的报价。我想要做的是获取Quote和QuoteInfo列表,其中包含具有特定语言的列表,该列表将是1 Quote并且其QuoteInfo列表的计数为1.

2 个答案:

答案 0 :(得分:1)

试试这个:

var quotes = dbContext.Quotes
    .Select(x=>new 
     { 
         Quote=x, 
         QuouteInfos=x.QuoteInfo.Where(y=>y.Language==myPreferedLanguage) 
     });

它会将其选择到新列表,其中QuouteQouteInfos仅位于myPreferedLanguage

答案 1 :(得分:1)

如果要应用过滤,则需要使用DbContext直接查询QuoteInfo实体。

int quoteId = ; // Id of the Quote you want to get the infos
var myLanguage = ;  // lange of the infos you want to get

var infos = dbContext.QuoteInfos.Where(p=>p.QuoteId == quoteId && p.Language == myLanguage);

使用NavigationProperties(在您的情况下为QuoteInfo)将始终加载整个相关实体,并且在内存中应用使用Where语句的任何附加过滤。

<强>更新 当我理解你的评论权利时,你想获得所有报价,其中报价信息与特定语言相匹配。在这种情况下,您可以使用以下查询。

var languageDependantQuote = from quote in dbContext.Quotes 
                             from info in quote.QuoteInfos 
                             where info.Language == myLanguage 
                             select quote;