如何使用include与实体SQL连接表

时间:2013-01-10 08:37:10

标签: c# entity-framework

我将尝试详细描述我的问题。我有以下情况。

1。)我有3个表:business,customoffice(Custom Office)和cusdesc(自定义办公室描述)

关系是一个企业在定制办公室,一个定制办公室有许多cusdesc。

表业务有一个字段customofficeno,它是customoffice表的字段cuscode的外键。表cusdesc有一个字段cuscode,它是customoffice表的字段cuscode的外键。

目标是使用实体框架选择包括自定义办公室和自定义办公室描述的业务。

2。)代码

我有一个填充数据网格的过程FillData。我的目标是显示3个表中的字段。我设法显示表“Business”和“Customoffice”的数据,但我需要通过表“cusdesc”显示自定义办公室的描述,更具体的是“CSNAME”字段。

3.。)我的问题是,当我包含(“CUSTOMSOFFICE.CUSDESC”)时,结果不包含表“CUSDESC”中的数据,而只包含多少条记录,因此我无法访问字段“CSNAME”< / p>

以下是程序:

using (var _context = new ReftabEntities())
        {
            try
            {
                SetGlobalValues();


                ObjectQuery<BUSINESS> q_business = _context.BUSINESS.Where("it.BUSINESSNO=" + int.Parse(pv_businessno)).Where(string.Format("(it.BUSINESSSTART <= DATETIME'{0:yyyy-MM-dd HH:mm}') and (it.BUSINESSCLOSED >= DATETIME'{0:yyyy-MM-dd HH:mm}')", pv_date)).Include("CUSTOMSOFFICE").Include("CUSTOMSOFFICE.CUSDESC");


                gvBusinessList.Caption = "Total records selected: " + q_business.Count();
                gvBusinessList.DataSource = q_business;
                gvBusinessList.DataBind();
            }
            catch (Exception e)
            {
                errorPopup.Text = e.Message;
                errorPopup.ShowOnPageLoad = true;
            }
            finally
            {
                _context.Dispose();
            }
        }
    }

请你暗示我做错了什么。

提前致谢。

1 个答案:

答案 0 :(得分:1)

Include运算符只是要求EF使用查询加载相关实体。如果您不使用“Include”,EF将仅提取BUSINESS的属性,并且不会提取CUSTOMSOFFICE的属性。不需要“Include(”CONSOMSOFFICE.CUSDESC“)”,因为您已经在第一个Include中加载了整个CUSTOMSOFFICE实体。

我看到你将结果绑定到网格视图,如果我理解正确,问题是“CUSTOMSOFFICE.CUSDESC”没有显示在gridview中。我相信这是因为gridview尝试呈现“CUSTOMSOFFICE”对象本身的表示,因为这是您绑定的项目的直接属性。为了更好地控制gridview的“列”,我建议使用LINQ将查询结果转换为您明确要显示的内容。

我假设BUSINESSNO,BUSINESSSTART和BUSINESSCLOSED是您的Business实体本身的属性,而BUSINESSNO是主键。让我将您的查询重写为:

var q_business = _context.BUSINESS.Include(b=>b.CUSTOMSOFFICE)
                          .Where(p => p.BUSINESSNO == int.Parse(pv_businessno)
                                      && p.BUSINESSSTART <= DateTime.Parse(pv_date)
                                      && p.BUSINESSCLOSED >= DateTime.Parse(pv_date) )
                          .FirstOrDefault();

此查询将提取与给定的pv_businessno匹配且属于您的日期条件的业务详细信息(包括相关的CUSTOMSOFFICE详细信息)。但是您无法将此绑定到gridview,因为您可能会遇到未显示CUSTOMSOFFICE.DESC的相同问题。要确保正确显示,您必须确定要包含的属性。例如,如果您只想显示以下属性集:

  1. BUSINESS.BUSINESSNO
  2. BUSINESS.BUSINESSNAME
  3. BUSINESS.CUSTOMSOFFICE.CUSCODE
  4. BUSINESS.CUSTOMSOFFICE.CUSDESC
  5. 您应该明确地将输出转换为显示并立即包含这些属性。

    var q_business = _context.BUSINESS.Include(b=>b.CUSTOMSOFFICE)
                              .Where(b => b.BUSINESSNO == int.Parse(pv_businessno)
                                          && b.BUSINESSSTART <= DateTime.Parse(pv_date)
                                          && b.BUSINESSCLOSED >= DateTime.Parse(pv_date) )
                              .Select(b => new {BusinessNo = b.BUSINESSNO,
                                                BusinessName = b.BUSINESSNAME,
                                                CustomsOfficeCode = b.CUSTOMSOFFICE.CUSCODE,
                                                CustomsOfficeDesc = b.CUSTOMSOFFICE.CUSDESC } ) //This Select statement creates a new anonymous type that has Businessno, BusinessName, CustomsOfficeCode, and CustomsOfficeDesc properties
                              .FirstOrDefault();
    

    将此绑定到gridview时,它应该能够显示CUSDESC属性的值。