【问题标题】:How can I query a table by its proterty's specific value when the property is a list?当属性是列表时,如何通过其属性的特定值查询表?
【发布时间】:2013-09-27 23:47:11
【问题描述】:

我有一个名为QuoteQuoteInfo 的类。而Quote 类有一个ListQuoteInfo。像这样:

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

...所有QuoteInfos 都附带它(当然启用了延迟加载)。但我只想获得具有特定语言的QuoteInfos。我怎样才能在一个查询中做到这一点?

提前致谢。

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

【问题讨论】:

  • dbContext.Quotes.ToList() 只会加载所有报价。仅当您使用实体的 NavigationProperty QuoteInfo 时才会加载 QouteInfos。

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


【解决方案1】:

试试这个:

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

它会将其选择到新列表中,其中您有 QuouteQouteInfos,它们仅在 myPreferedLanguage

【讨论】:

  • 不幸的是,这不起作用。我认为该查询获取所有 QuoteInfos 语言为 myPreferredLanguage 的所有引号,因为它返回了相同的结果。我正在寻找的是获取所有报价并按他们的语言过滤他们的报价信息。
  • 这行得通,但它只返回报价的 QuoteInfo 属性,我认为是因为选择。我还能做些什么来加载其他属性?
  • @MustafaKarakuş Quoute 还有其他属性,例如qoutes.First().Quoute.Text
  • 是的,还有其他属性。我不认为将这些属性添加到 Select 语句中会非常有效。我还能做些什么来加载它们?
  • @MustafaKarakuş 您没有将它们添加到选择中,您可以从选择返回的对象中访问它们
【解决方案2】:

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

【讨论】:

  • 但我想做的是使用这些 QuoteInfos 获取报价,而不仅仅是 QuoteInfos。或者我应该只删除虚拟属性以禁用延迟加载,然后将 Quotes 的 QuoteInfo 属性设置为我通过您的查询获得的过滤值?我认为这会损害性能。
  • @MustafaKarakuş 你的意思是这样的查询from quote in dbContext.Quotes from info in quote.QuoteInfos where info.Language == myLanguage select quote
  • 很抱歉我不够具体。我的意思是我想获得具有特定语言的 Quotes 及其 QuoteInfos。例如,我有一个带有 2 个 QuoteInfos 的报价。我想要做的是获取 Quote 和包含具有特定语言的 QuoteInfo 列表,这将是 1 Quote 并且其 QuoteInfo 列表的计数为 1。我应该将此示例添加到主帖子中:)
  • @MustafaKarakuş 这是不可能的,因为 NavigationProperties 将始终包含所有相关实体,因此您需要使用 quote.QouteInfos.Where(p=&gt;p.Language == myLanguage) 在内存中应用过滤。
  • 我理解并感谢您的回答。我只是担心性能,因为使用 Quote 获取所有 QuoteInfos(而我只需要特定的)似乎无效。但如果那是不可能的,我想没有什么可做的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多