当属性是列表时,如何按表的特定值查询表

本文关键字:查询表 何按表 属性 列表 | 更新日期: 2023-09-27 18:32:33

我有一个名为QuoteQuoteInfo的类。Quote类有QuoteInfo List.喜欢这个:

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 个报价信息的报价。我想做的是获取报价和包含特定语言的报价信息列表,这将是 1 个报价,其报价信息列表的计数为 1。

当属性是列表时,如何按表的特定值查询表

试试这个:

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

它会将其选择到新列表中,其中您有QuouteQouteInfos

,这些列表仅在myPreferedLanguage

如果要应用筛选,则需要直接使用 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;