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 将不会加载相关数据。这是有道理的,否则如果有很多关系,你可能会加载几乎整个数据库。