0

因此,对于我当前的应用程序,我需要使用返回单个对象的存储库来查询数据库。问题是信息被分成两个不同的表。我试图获取的对象是 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 记录,这些记录彼此重复。有任何想法吗?

谢谢

史蒂夫

4

2 回答 2

2

你必须初始化一个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
于 2013-08-07T18:51:53.830 回答
0

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

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

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

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

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

using System.Data.Entity;
于 2013-08-07T18:58:16.463 回答