首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用include with entity SQL连接表

如何使用include with entity SQL连接表
EN

Stack Overflow用户
提问于 2013-01-10 16:37:10
回答 1查看 148关注 0票数 0

我将尝试详细描述我的问题。我有以下场景。

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

这种关系是一个企业有一个客户办公室,一个客户办公室有多个客户办公室。

表业务具有字段CustomOffice0,它是customoffice table.The表cuscode字段cuscode的外键。

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

2.)代码

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

3.)我的问题是,当我包括("CUSTOMSOFFICE.CUSDESC")时,结果不包含来自表"CUSDESC“的数据,而只包含有多少记录符合条件,因此我无法访问字段"CSNAME”。

下面是操作步骤:

代码语言:javascript
复制
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();
            }
        }
    }

你能给我一点提示吗?我做错了什么。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-01-10 17:12:52

Include操作符只要求EF加载一个与查询相关的实体。如果不使用Include,EF将只提取业务的属性,而不提取CUSTOMSOFFICE的属性。不需要" Include ("CONSOMSOFFICE.CUSDESC")“,因为您已经在第一个Include中加载了整个CUSTOMSOFFICE实体。

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

我假设BUSINESSNO、BUSINESSSTART和BUSINESSCLOSED是业务实体本身的属性,BUSINESSNO是主键。让我将您的查询重写为以下内容:

代码语言:javascript
复制
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详细信息)。但是你还不能把它绑定到你的网格视图上,因为你可能会遇到同样的问题,CUSTOMSOFFICE.DESC不会显示。要确保正确显示,必须确定要包含的属性。例如,如果您只想显示下面的属性集:

  1. BUSINESS.BUSINESSNO
  2. BUSINESS.BUSINESSNAME
  3. BUSINESS.CUSTOMSOFFICE.CUSCODE
  4. BUSINESS.CUSTOMSOFFICE.CUSDESC

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

代码语言:javascript
复制
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特性的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14253703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档