【问题标题】:Entity Framework Code First Query实体框架代码优先查询
【发布时间】:2017-06-17 11:37:13
【问题描述】:

这是我的桌子(公司)

Companyid   Company_Name  ParentCompany_ID
957         Company1      6211
4816        Company2      Null
1922        Company3      7565
6211        Company4      Null

这是我的 HTML。

               <div class="responsive-table">
                    <div class="row-width desktop-header">                           
                        <div class="col-md-5">Company</div>
                        <div class="col-md-5">Parent Company</div>
                    </div>
                    <div class="list-font row" data-ng-repeat="company in vm.companies">
                        <div class="col-md-2">
                            <div class="mobile-header">Name:</div>
                        </div>                            
                        <div class="col-md-5">
                            <div class="mobile-header">Parent Company:</div>
                        </div>
                    </div>
                </div>

我需要从公司表中检索名称和母公司名称。这是我的代码。

private List<Company> GetCompany()
    {
        return dbContext.Companies
                .Where(p => p.Id == ID)                   
                .ToList();
    }

在主函数中我有这样的东西

List<Company>company = GetCompany();
Result = new CompanyModel()
{ 
    Name = company.Name
};

我有点不知道如何检索母公司名称。

编辑:这个概念是,如果 ParentCompany_Id 不为空,则它是 companyid 的母公司。例如,在表中,957 是子公司,6211 是母公司。在第 2 行中,4816 是母公司,因为 ParentCompany_Id 为空。所以,我需要从同一个表中检索公司名称和 ParentCompany 名称。

【问题讨论】:

  • 作为回报,您将获得母公司 ID。在模态类中,请参考具有父公司 ID 和名称的表
  • 您要返回一组记录吗?或者它是一个网格,你想全部返回?
  • 您使用的是代码优先方法,只需在课堂上给出一对多关系,您就会得到数据。

标签: c# sql entity-framework ef-code-first


【解决方案1】:
private Company GetCompany()
{
        return dbContext.Companies
                .Where(p => p.Id == ID)                   
                .FirstOrDefault();
}

然后,

string ParentCompanyId = GetCompany().ParentCompany_ID;

【讨论】:

    【解决方案2】:

    你的方法GetCompany应该是Company类型而不是List&lt;Company&gt;,因为它通过Id返回结果,而且有id参数更方便调用它:

    private static Company GetCompany(id)
     {
             if(id == null) return new Company();
             var company = dbContext.Companies
                                    .SingleOrDefault(p => p.Id == id);
              return company;     
    }
    

    现在您可以轻松创建模型了:

    var company = GetCompany(957);
    var result = new CompanyModel()
                 { 
                    Name = company.Name,
                    ParName = GetCompany(company.ParentCompany_ID).Name
                  };
    

    【讨论】:

    • 这应该不需要两次访问数据库。
    • 然后他可以进行连接查询并将结果直接投射到模型中
    【解决方案3】:

    鉴于您的实体可能会包含更多详细信息而不仅仅是名称,包括相关数据等...

    public class Company
    {
       public int CompanyId { get; set; }
       public string CompanyName { get; set; } 
       public int? ParentCompanyId { get; set; }
       [ForeignKey("ParentCompanyId")]
       public virtual Company ParentCompany { get; set; }
    }
    

    然后给出通过 ID 检索公司....

    var company = dbContext.Companies.SingleOrDefault(c=> c.CompanyId == id);
    // where company != null...
    
    //lazy load the parent...
    var parent = company.ParentCompany;
    
    //eager load parent with company...
    var company = dbContext.Companies
        .Where(c => c.CompanyId == id)
        .Include(c => c.Parent)
        .SingleOrDefault();
    
    // better, if you know the view model you want...
    var viewModel = dbContext.Companies
        .Where(c => c.CompanyId == id)
        .Select(c => new CompanyViewModel 
        { 
            c.CompanyId, 
            c.CompanyName, 
            ParentCompanyName = c.ParentCompany != null 
              ? c.ParentCompany.CompanyName 
              : string.Empty 
        }).SingleOrDefault();
    

    最后一个示例来自内存,可能需要进行一些调整,但明确检索的值的好处是它可以最大限度地减少通过网络发送的数据。对于小型域对象,不必费心,但对于更大、更复杂的对象图,它可以节省很多性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多