【问题标题】:Get foreign key value without join In Entity-to-Linq [closed]在不加入实体到Linq的情况下获取外键值[关闭]
【发布时间】:2016-01-16 10:15:43
【问题描述】:

Employee 表具有与Department 表的Id 列相关的Departmentid 外键。

现在,如果我从Employee 表中选择所有行,我应该在Employee 表的外键列中获取它们各自DepartmentId 的部门名称。

我正在使用实体框架,我可以通过创建Department 表的另一个对象来使用连接。

输出应该是这样的:

EmployeeName    EmployeeAddress  EmployeeDepartment
    abc            xyz                  IT

它应该自动获取Employee的外键值

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();

在这里我如何删除加入并使用 itemid 外键直接使用 itemname

【问题讨论】:

  • 我猜你的意思是没有 explicit 加入你的查询。使用导航属性,EF 会为您做到这一点。
  • 是的,我不想加入并制作另一个对象并匹配两个属性。如果我使用外键关系,它应该自动获取它的值
  • 您的实际问题是什么?您能否提供一些代码并更详细地描述问题?
  • 自动获取外键值而不使用 join ,使用 Linq-Entity Query ?我的问题没有什么花哨的,请阅读文字
  • 您的问题和代码不匹配。我建议您阅读Entity Framework associations mapping。

标签: c# entity-framework linq linq-to-sql linq-to-entities


【解决方案1】:

我猜这就是你要找的东西:

你可以制作一个 DTO(Data Transfer Object),在层之间传输数据

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}");

Here is an example in DotNetFiddle

如果不想创建 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 与 Eager Loading 一起使用,则必须使用 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);

【讨论】:

  • 我们将如何使用 Linq Query ,
  • 你能看看我的更新@Pedro
  • 你错过了标记。问题正是关于你没有解释的事情:如何让sls.Item.ItemName 等导航属性正常工作。顺便说一句,您最后一个代码片段中的Include 无效。
  • 非常感谢您的回复,是的,它有效,但请您解释一下您做了什么。这些东西是如何运作的。
  • @Akash 当您在每个实体中都有导航属性时,您不需要在表之间显式连接,因为 EF 将为您完成工作,这就是我所做的。我使用 linq-to-sql 并直接访问导航属性。
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2021-12-16
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多