Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 获取外键值而不将实体连接到Linq_C#_Entity Framework_Linq_Linq To Sql_Linq To Entities - Fatal编程技术网

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并直接访问导航属性。