繁体   English   中英

LINQ 到实体 - 内部连接问题

[英]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 到实体有什么好处?
如果我像在查询中那样删除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 会自动生成所有需要的连接。 但是,如果您只是 select 整个实体而没有定义Include - EF 将不会加载相关数据。 这是有道理的,否则如果有很多关系,您可能会加载几乎整个数据库。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM