LINQ To实体-内部加入问题



我有两个相关的表,如下所示:

用户:

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中对实体有什么好处
如果我像在查询中那样删除join,我仍然可以看到带有user.UserTypes.Name的UserType的Name字段。

如果定义了正确的导航属性,则不需要联接。如果您只需要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会自动生成所有需要的联接。但如果只选择整个实体而不定义Include-EF,则不会加载相关数据。这是有道理的,因为否则,如果有很多关系,您可能会加载几乎整个数据库。

由于您已经在实体中设置了关系,因此不需要手动编写联接来加载相关数据:

var user = entities.Users
.Include(u => u.UserTypes)
.Where(u => u.ID == User_ID_Integer)
.FirstOrDefault();

至于您的联接是无用的-EF Core将代码转换为实际的SQL(您可以检查(,并且由于您没有从联接表中选择任何数据-它与SQL查询中一样无用,因为您只从联接结果的一个表中选择了字段。

最新更新