C# Linq到实体(EF):如何在不进行连接的情况下获取FK的值

C# Linq到实体(EF):如何在不进行连接的情况下获取FK的值,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我正在使用Linq转换实体。我有一个主表,Employee setup,其中有一个名为vendorID的字段。供应商ID是供应商表中的外键 现在,Employee对象并不直接公开vendorID。相反,我只能通过以下方式访问它: var employee = (from e in context.Employees.Include("tbl_vendors") where e.employeeID = 1 select e).First

我正在使用Linq转换实体。我有一个主表,Employee setup,其中有一个名为vendorID的字段。供应商ID是供应商表中的外键

现在,Employee对象并不直接公开vendorID。相反,我只能通过以下方式访问它:

var employee = (from e in context.Employees.Include("tbl_vendors")
               where e.employeeID = 1
               select e).FirstOrDefault();

//this gets the vendor ID
int vendorID = employee.tbl_vendors.vendorID;

这很好,但对数据库来说是额外的工作,因为它在不需要连接的地方强制进行连接。有没有一种方法可以在不被强制连接到tbl_vendors表的情况下获取该键值?

此处不确定对象名称,但您可以从entity key属性中获取该键,而无需访问数据库,如下所示:

var employee = (from e in context.Employees
               where e.employeeID = 1
               select e).FirstOrDefault();

//this gets the vendor ID
int vendorID = (int)employee.tbl_vendorsReference.EntityKey.EntityKeyValues[0].Value;
var results = from e in ctx.Employees
              select e.tbl_vendors.ID;

var query = results as ObjectQuery<int>;
string sql = query.ToTraceString();

您可以通过实体引用访问外键

Employee employee = context.Employees.Single(e => e.employeeID == 1);

Int32 vendorID = (Int32)employee.tbl_vendorsReference.EntityKey.
   EntityKeyValues[0].Value;

有关和类的参考信息,请参见MSDN。

实际上这非常简单,您基本上可以这样做:

var tblVendorID = (from e in context.Employees
                  select e.tbl_vendors.ID).FirstOrDefault();
即使这看起来像是在进行连接L2E也会优化连接

您可以使用如下代码确认:

var employee = (from e in context.Employees
               where e.employeeID = 1
               select e).FirstOrDefault();

//this gets the vendor ID
int vendorID = (int)employee.tbl_vendorsReference.EntityKey.EntityKeyValues[0].Value;
var results = from e in ctx.Employees
              select e.tbl_vendors.ID;

var query = results as ObjectQuery<int>;
string sql = query.ToTraceString();
var结果=来自ctx.Employees中的e
选择e.tbl_vendors.ID;
var query=作为ObjectQuery的结果;
字符串sql=query.ToTraceString();
希望这有帮助
Alex(Microsoft)。

那么,没有办法通过名称而不是键的索引位置来引用它吗?使用索引似乎很危险,因为如果向表中添加新的键,索引可能会发生更改。它不是键的索引位置,它是列在键中的索引位置-它考虑了复合键的可能性。您可以搜索EntityKey.EntityKeyValues并检查包含键名的EntityKeyMember.key属性,以查找要查找的键值。