【问题标题】:Returning a multiple table LINQ query as one object将多表 LINQ 查询作为一个对象返回
【发布时间】:2013-08-07 18:44:12
【问题描述】:

因此,对于我当前的应用程序,我需要使用返回单个对象的存储库来查询数据库。问题是信息被分成两个不同的表。我试图获取的对象是 Rule 对象。规则类由以下数据库实体组成:

class Rule
    {
        STRATRULEDEF ruleDefinition { get; set; }
        List<STRATCODE> ruleCodeList { get; set; }

在我的存储库中,我使用以下查询来获取相关信息:

public void GetRule(int ruleKey)
        {
            Rule ruleQuery = from ruleDefinition in AREContext.STRATRULEDEFs
                            from ruleCodes in AREContext.STRATCODES
                            where ruleDefinition.STRATRULEKEY == ruleKey 
                                  && ruleCodes.STRATRULEKEY == ruleKey
                            select new { ruleDefinition, ruleCodes };

所以我有两个问题。

1) 如何将 ruleQuery 作为“Rule”对象返回,如果我将“var”更改为 rule,则会收到以下错误:

错误 10 无法将类型“System.Linq.IQueryable”隐式转换为“TestRules.Rule”。存在显式转换(您是否缺少演员表?)

我可以将 System.Linq.IQueryable 转换为 TestRules.Rule 吗?

2) 我的表具有一对多的关系,因此查询应该返回一个 ruleDef 记录和多个 ruleCode 记录,但是目前我得到多个相互重复的 ruleDef 记录。有什么想法吗?

谢谢

史蒂夫

【问题讨论】:

    标签: c# linq entity-framework repository relational-database


    【解决方案1】:

    你必须初始化一个Rule对象,如果你想要一个对象,你可以使用FirstOrDefault

    IEnumerable<Rule> rules = from ruleDefinition in AREContext.STRATRULEDEFs
                              from ruleCodes in AREContext.STRATCODES
                              where ruleDefinition.STRATRULEKEY == ruleKey 
                                 && ruleCodes.STRATRULEKEY == ruleKey
                              select new Rule
                              { 
                                  ruleDefinition = ruleDefinition, 
                                  ruleCodeList = ruleCodes.ToList()
                              };
    Rule firstRule = rules.FirstOrDefault();  // can be null if rules is empty
    

    【讨论】:

    • 尝试您的方法我遇到了类似的错误错误 10 无法将类型“System.Linq.IQueryable”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(您是否缺少演员表?)
    • 我不熟悉实体框架。尝试将AsEnumerable() 添加到前两行以强制使用LINQ to Objects 运行。
    【解决方案2】:

    因为您标记了 EntityFramework,所以您在此处还有另一个选项来分层加载数据。

    假设您在两者之间有导航属性,例如 ruleDefinition 上的外键到 ruleCodes 集合,您应该能够执行类似的操作

    AREContext.STRATRULEDEFs.Include(s => s.STRATCodes).ToList;
    

    这将返回您的 STRATRULEDEFs 对象的列表,每个对象都具有一个已加载的 STRATCODES 集合的属性。从这里开始,可以手动或通过使用映射插件轻松实现到替代类的映射。

    请注意,Include 是一种扩展方法,因此请务必将以下内容添加到您的文件中。

    using System.Data.Entity;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多