0

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

1.) 我有 3 个表:business、customoffice(Custom Office) 和 cusdesc(custom office description)

关系是一个企业有customoffice,一个customoffice有很多cusdesc。

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

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

2.) 代码

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

3.)我的问题是,当我包含(“CUSTOMSOFFICE.CUSDESC”)时,结果不包含表“CUSDESC”中的数据,但只有多少条记录符合标准,所以我无法访问“CSNAME”字段

以下是程序:

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

你能告诉我我做错了什么吗?

提前致谢。

4

1 回答 1

1

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

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

我假设 BUSINESSNO、BUSINESSSTART 和 BUSINESSCLOSED 是您的业务实体本身的属性,而 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. 商务.海关.CUSDESC

您应该将输出转换为显式并立即包含这些属性。

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

当您将此绑定到您的网格视图时,它应该能够显示 CUSDESC 属性的值。

于 2013-01-10T09:12:51.767 回答