LINQ To Entity - 内部连接问题
LINQ To Entity - Inner Join issue
我有两个相关的表格,如下所示:
用户:
public partial class Users
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Users()
{
}
public int ID { get; set; }
public int UserType_ID { get; set; }
public string Email { get; set; }
public virtual UserTypes UserTypes { get; set; }
}
用户类型:
public partial class UserTypes
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public UserTypes()
{
this.Users = new HashSet<Users>();
}
public int ID { get; set; }
public string Name { get; set; }
public string Title { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Users> Users { get; set; }
}
为了访问 UserType 的名称,我将此 linq 写入实体:
string[] UserTypes = new string[1];
using (Crypto_Entities entities = new Crypto_Entities())
{
int User_ID_Integer = int.Parse(User_ID.Trim());
var user = (from User in entities.Users
//join UserType in entities.UserTypes on User.UserType_ID equals UserType.ID
where User.ID == User_ID_Integer
select User).FirstOrDefault();
if (user != null)
{
UserTypes[0] = user.UserTypes.Name;
}
}
我的问题是为什么 user.Name
对我的目的不起作用,join
在 linq to entity 中有什么好处?
如果我像在查询中那样删除 join
,我仍然可以看到带有 user.UserTypes.Name
.
的 UserType 的名称字段
由于您已经在您的实体中设置了关系,因此您不需要手动编写加入 load related data:
var user = entities.Users
.Include(u => u.UserTypes)
.Where(u => u.ID == User_ID_Integer)
.FirstOrDefault();
至于你的加入是无用的——EF Core 将代码翻译成实际的 SQL(你可以 check)并且因为你没有从加入的 table 中选择任何数据- 它与在 SQL 查询中一样无用,您只从一个 table 连接结果中选择了字段。
如果您已经正确定义了导航属性,则不需要加入。如果您只需要 Name
,请不要检索完整的实体。
string[] UserTypes = new string[1];
using (Crypto_Entities entities = new Crypto_Entities())
{
int User_ID_Integer = int.Parse(User_ID.Trim());
var query =
from User in entities.Users
where User.ID == User_ID_Integer
select User.UserTypes.Name;
var name = query.FirstOrDefault();
if (name != null)
{
UserTypes[0] = name;
}
}
如果您在查询中使用导航 属性,EF 会自动生成所有需要的连接。但是,如果您只是 select 整个实体而没有定义 Include
- EF 将不会加载相关数据。这是有道理的,否则如果有很多关系,你可能会加载几乎整个数据库。
我有两个相关的表格,如下所示:
用户:
public partial class Users
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Users()
{
}
public int ID { get; set; }
public int UserType_ID { get; set; }
public string Email { get; set; }
public virtual UserTypes UserTypes { get; set; }
}
用户类型:
public partial class UserTypes
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public UserTypes()
{
this.Users = new HashSet<Users>();
}
public int ID { get; set; }
public string Name { get; set; }
public string Title { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Users> Users { get; set; }
}
为了访问 UserType 的名称,我将此 linq 写入实体:
string[] UserTypes = new string[1];
using (Crypto_Entities entities = new Crypto_Entities())
{
int User_ID_Integer = int.Parse(User_ID.Trim());
var user = (from User in entities.Users
//join UserType in entities.UserTypes on User.UserType_ID equals UserType.ID
where User.ID == User_ID_Integer
select User).FirstOrDefault();
if (user != null)
{
UserTypes[0] = user.UserTypes.Name;
}
}
我的问题是为什么 user.Name
对我的目的不起作用,join
在 linq to entity 中有什么好处?
如果我像在查询中那样删除 join
,我仍然可以看到带有 user.UserTypes.Name
.
由于您已经在您的实体中设置了关系,因此您不需要手动编写加入 load related data:
var user = entities.Users
.Include(u => u.UserTypes)
.Where(u => u.ID == User_ID_Integer)
.FirstOrDefault();
至于你的加入是无用的——EF Core 将代码翻译成实际的 SQL(你可以 check)并且因为你没有从加入的 table 中选择任何数据- 它与在 SQL 查询中一样无用,您只从一个 table 连接结果中选择了字段。
如果您已经正确定义了导航属性,则不需要加入。如果您只需要 Name
,请不要检索完整的实体。
string[] UserTypes = new string[1];
using (Crypto_Entities entities = new Crypto_Entities())
{
int User_ID_Integer = int.Parse(User_ID.Trim());
var query =
from User in entities.Users
where User.ID == User_ID_Integer
select User.UserTypes.Name;
var name = query.FirstOrDefault();
if (name != null)
{
UserTypes[0] = name;
}
}
如果您在查询中使用导航 属性,EF 会自动生成所有需要的连接。但是,如果您只是 select 整个实体而没有定义 Include
- EF 将不会加载相关数据。这是有道理的,否则如果有很多关系,你可能会加载几乎整个数据库。