C# 获取外键值而不将实体连接到Linq
C# 获取外键值而不将实体连接到Linq,c#,entity-framework,linq,linq-to-sql,linq-to-entities,C#,Entity Framework,Linq,Linq To Sql,Linq To Entities,Employee表的Departmentid外键与Department表的Id列相关 现在,如果我从Employee表中选择所有行,我应该在Employee表的外键列中获取它们各自的DepartmentId的部门名称 我使用的是实体框架,我可以通过创建另一个Department表的对象来使用join 输出应如下所示: EmployeeName EmployeeAddress EmployeeDepartment abc xyz
Employee
表的Departmentid
外键与Department
表的Id
列相关
现在,如果我从Employee
表中选择所有行,我应该在Employee
表的外键列中获取它们各自的DepartmentId
的部门名称
我使用的是实体框架,我可以通过创建另一个Department
表的对象来使用join
输出应如下所示:
EmployeeName EmployeeAddress EmployeeDepartment
abc xyz IT
它应该自动为员工
lamiEntities1 lam = new lamiEntities1();
var query =( from sls in lam.sales.AsEnumerable() join it in lam.items on sls.ItemId equals it.Id orderby sls.Id descending
select new
{
ItemName = it.ItemName,
TotalAmounts = sls.Amount,
Remarks=sls.Remarks,
Dates = sls.Date
}).Take(20);
GridView1.DataSource = query;
GridView1.DataBind();
在这里,我如何删除join并使用itemid forign key直接使用itemname我想这就是您想要的: 您可以制作DTO(数据传输对象),以便在层之间传输数据
public class EmployeeWithDepartmentDto
{
public string EmployeeName { get; set; }
public string EmployeeAddress { get; set; }
public string DepartmentName { get; set; }
}
结果如下:
var result = employeeRepository.Select(e => new EmployeeWithDepartmentDto { EmployeeName = e.Name, EmployeeAddress = e.Address, DepartmentName = e.Department.Name });
foreach (var employeeWithDepartmentDto in result)
Console.WriteLine($"Name: {employeeWithDepartmentDto.EmployeeName}, Address: {employeeWithDepartmentDto.EmployeeAddress}, Department: {employeeWithDepartmentDto.DepartmentName}");
如果不想创建DTO类,可以使用匿名对象进行查询
var result = employeeRepository.Select(e => new { EmployeeName = e.Name, EmployeeAddress = e.Address, DepartmentName = e.Department.Name });
也可以使用Linq To Sql进行如下查询:
var result = from e in employeeRepository
select new EmployeeWithDepartmentDto
{
EmployeeName = e.Name,
EmployeeAddress = e.Address,
DepartmentName = e.Department.Name
}
如果使用EF with,则必须使用Include,方法如下:
lamiEntities1 lam = new lamiEntities1();
var query =( from sls in lam.sales.Include("item")
orderby sls.Id descending
select new
{
ItemName = sls.Item.ItemName,
TotalAmounts = sls.Amount,
Remarks=sls.Remarks,
Dates = sls.Date
}).Take(20);
我猜你的意思是在你的查询中没有明确的连接。使用导航属性,EF将为您执行此操作。是的,我不想加入并创建另一个对象并匹配两个属性。如果我使用外键关系,它应该自动获取其值。您的实际问题是什么?您能提供一些代码并更详细地描述这个问题吗?不使用join、使用Linq实体查询自动获取外键值吗?我的问题没有什么特别之处,请阅读文本您的问题和代码不匹配。我建议你做一些阅读。我们将如何使用Linq查询,请你看看我的更新@PedroYou缺少标记。问题正是关于你没有解释的事情:如何让导航属性如
sls.Item.ItemName
工作。顺便说一句,您上一个代码片段中的Include
无效。非常感谢您的回复是的,它有效,但您能解释一下您所做的吗。这些东西是如何工作的。@Akash当您在每个实体中都有导航属性时,您不需要显式地在表之间建立联接,因为EF将为您工作,这就是我所做的。我使用LINQtoSQL并直接访问导航属性。