Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用包含实体SQL连接表_C#_Entity Framework - Fatal编程技术网

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

C# 如何使用包含实体SQL连接表,c#,entity-framework,C#,Entity Framework,我将尝试详细描述我的问题 1.)我有3张表:business、customoffice(Custom Office)和cusdesc(Custom Office description) 这种关系是指一个企业在customoffice上拥有多个客户,而一个customoffice拥有多个客户 表业务有一个字段customofficeno,它是customoffice表的字段cuscode的外键。表cusdesc有一个字段cuscode,它是customoffice表的字段cuscode的外键 目

我将尝试详细描述我的问题

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

这种关系是指一个企业在customoffice上拥有多个客户,而一个customoffice拥有多个客户

表业务有一个字段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();
            }
        }
    }
使用(var\u context=new ReftabEntities())
{
尝试
{
SetGlobalValues();
ObjectQuery q_business=_context.business.Where(“it.BUSINESSNO=“+int.Parse(pv_BUSINESSNO)).Where(string.Format(“(it.BUSINESSSTART=DATETIME'{0:yyyy-MM-dd HH:MM}'),pv_-date)).Include(“CUSTOMSOFFICE”).Include(“CUSTOMSOFFICE.CUSDESC”);
gvBusinessList.Caption=“所选记录总数:”+q_business.Count();
gvBusinessList.DataSource=q_业务;
gvBusinessList.DataBind();
}
捕获(例外e)
{
errorPopup.Text=e.消息;
errorPopup.ShowOnPageLoad=true;
}
最后
{
_context.Dispose();
}
}
}
你能暗示一下我做错了什么吗


提前感谢。

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

我看到您正在将结果绑定到网格视图,如果我理解正确,问题是“CUSTOMSOFFICE.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();
var q\u business=\u context.business.Include(b=>b.CUSTOMSOFFICE)
.Where(p=>p.BUSINESSNO==int.Parse(pv_BUSINESSNO)
&&p.BUSINESSSTART=DateTime.Parse(pv_日期))
.FirstOrDefault();
此查询将提取与给定pv_businessno匹配且符合您的日期条件的业务详细信息(包括相关的CUSTOMSOFFICE详细信息)。但是您还不能将其绑定到gridview,因为在不显示CUSTOMSOFFICE.DESC的情况下可能会遇到相同的问题。为确保正确显示,必须确定要包括哪些属性。例如,如果您只想显示以下属性集:

  • 商务号
  • BUSINESS.BUSINESSNAME
  • BUSINESS.CUSTOMSOFFICE.CUSCODE
  • 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();
    
    var q\u business=\u context.business.Include(b=>b.CUSTOMSOFFICE)
    .Where(b=>b.BUSINESSNO==int.Parse(pv_BUSINESSNO)
    &&b.BUSINESSSTART=DateTime.Parse(pv_日期))
    .Select(b=>new{BusinessNo=b.BusinessNo,
    BusinessName=b.BusinessName,
    CUSTOMSOFFICE代码=b.CUSTOMSOFFICE.CUSCODE,
    CustomsOfficeDesc=b.CUSTOMSOFFICE.CUSDESC})//此Select语句创建一个新的匿名类型,该类型具有Businessno、BusinessName、CustomsOfficeCode和CustomsOfficeDesc属性
    .FirstOrDefault();
    

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

    嗨,Jeric,感谢您的即时响应。我将重写我的代码并尽快返回结果。