如何使用包含实体SQL连接表

本文关键字:连接 SQL 实体 何使用 包含 | 更新日期: 2023-09-27 17:51:08

我将尽力详细描述我的问题。我有下面的场景。

1)。我有3张表:business, customoffice(海关办公室)和cusdesc(海关办公室描述)

关系是一个企业有一个海关,一个海关有多个海关。

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

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

2)。代码

我有一个过程FillData填充数据网格。我的目标是显示3个表中的字段。我设法从表"业务"answers"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();
            }
        }
    }

你能给我提示一下我做错了什么吗

如何使用包含实体SQL连接表

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

我看到您将结果绑定到网格视图,如果我理解正确的话,问题是"CUSTOMSOFFICE"。gridview中没有显示"CUSDESC"。我相信这是因为gridview试图呈现"CUSTOMSOFFICE"对象本身的表示,因为这是您要绑定的项的直接属性。为了更好地控制gridview的"列",我建议使用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,因为您可能会遇到customoffice。不显示DESC。为了确保正确显示,必须确定要包含哪些属性。例如,如果您只想在下面显示一组属性:

  1. 业务。BUSINESSNO
  2. 业务。BUSINESSNAME
  3. BUSINESS.CUSTOMSOFFICE.CUSCODE
  4. BUSINESS.CUSTOMSOFFICE.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();

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