C# 如何使用包含实体SQL连接表
我将尝试详细描述我的问题 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” 以下是程序: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的外键 目
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的情况下可能会遇到相同的问题。为确保正确显示,必须确定要包括哪些属性。例如,如果您只想显示以下属性集:
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,感谢您的即时响应。我将重写我的代码并尽快返回结果。