为什么我的一对零一对一关系总是产生与 entity framework 的内部连接?
Why my one-to-zero-one relationship always produce an inner join with entity framework?
我的分类声明如下:
[Table("Profil")]
public class Profil
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("CodeUtilisateur")]
[MaxLength(25)]
public string UtilisateurId { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
[ForeignKey("UtilisateurId")]
public virtual User User { get; set; }
}
[Table("vwADUser")]
public class User
{
[Key]
public string UserName { get; set; }
[Column("Mail")]
public string Email { get; set; }
}
这是我的 linq 查询。
var query = from profil in icDbContext.Profils
select new
{
profil.Nom,
profil.Prenom,
profil.UtilisateurId,
UserEmail = profil.User != null ? profil.User.Email : ""
};
var result = query.ToList();
发送到数据库的查询生成与视图 [dbo].[vwADUser].
的内部联接
SELECT
1 AS [C1],
[Extent1].[Nom] AS [Nom],
[Extent1].[Prenom] AS [Prenom],
[Extent1].[CodeUtilisateur] AS [CodeUtilisateur],
[Extent2].[Mail] AS [Mail]
FROM [ic].[Profil] AS [Extent1]
INNER JOIN [dbo].[vwADUser] AS [Extent2] ON [Extent1].[CodeUtilisateur] = [Extent2].[UserName]
我也试过这个查询,结果相同。
var query = from profil in icDbContext.Profils
join user in icDbContext.Users on profil.UtilisateurId equals user.UserName into gusers
from guser in gusers.DefaultIfEmpty()
select new
{
profil.Nom,
profil.Prenom,
profil.UtilisateurId,
UserEmail = guser != null ? guser.Email : ""
};
var result = query.ToList();
我尝试手动配置与此命令的几个变体的关系,但没有成功。
modelBuilder.Entity<Profil>()
.HasOptional(x => x.User)
.WithOptionalDependent();
知道如何配置我的关系以生成 LEFT JOIN 而不是 INNER JOIN 吗?
试试这个:
[Table("Profil")]
public class Profil
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("CodeUtilisateur")]
[MaxLength(25)]
public string UtilisateurId { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public virtual User User { get; set; }
}
[Table("vwADUser")]
public class User
{
[Key]
[ForeignKey("Profil")]
public string UserName { get; set; }
[Column("Mail")]
public string Email { get; set; }
public virtual Profil Profil {get;set;}
}
这就是你如何流利地做到这一点:
modelBuilder.Entity<Profil>()
.HasOptional(x => x.User) // User is optional for Profil
.WithRequired(z=>z.Profil); // but Profil is required for User
我的分类声明如下:
[Table("Profil")]
public class Profil
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("CodeUtilisateur")]
[MaxLength(25)]
public string UtilisateurId { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
[ForeignKey("UtilisateurId")]
public virtual User User { get; set; }
}
[Table("vwADUser")]
public class User
{
[Key]
public string UserName { get; set; }
[Column("Mail")]
public string Email { get; set; }
}
这是我的 linq 查询。
var query = from profil in icDbContext.Profils
select new
{
profil.Nom,
profil.Prenom,
profil.UtilisateurId,
UserEmail = profil.User != null ? profil.User.Email : ""
};
var result = query.ToList();
发送到数据库的查询生成与视图 [dbo].[vwADUser].
的内部联接SELECT
1 AS [C1],
[Extent1].[Nom] AS [Nom],
[Extent1].[Prenom] AS [Prenom],
[Extent1].[CodeUtilisateur] AS [CodeUtilisateur],
[Extent2].[Mail] AS [Mail]
FROM [ic].[Profil] AS [Extent1]
INNER JOIN [dbo].[vwADUser] AS [Extent2] ON [Extent1].[CodeUtilisateur] = [Extent2].[UserName]
我也试过这个查询,结果相同。
var query = from profil in icDbContext.Profils
join user in icDbContext.Users on profil.UtilisateurId equals user.UserName into gusers
from guser in gusers.DefaultIfEmpty()
select new
{
profil.Nom,
profil.Prenom,
profil.UtilisateurId,
UserEmail = guser != null ? guser.Email : ""
};
var result = query.ToList();
我尝试手动配置与此命令的几个变体的关系,但没有成功。
modelBuilder.Entity<Profil>()
.HasOptional(x => x.User)
.WithOptionalDependent();
知道如何配置我的关系以生成 LEFT JOIN 而不是 INNER JOIN 吗?
试试这个:
[Table("Profil")]
public class Profil
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("CodeUtilisateur")]
[MaxLength(25)]
public string UtilisateurId { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public virtual User User { get; set; }
}
[Table("vwADUser")]
public class User
{
[Key]
[ForeignKey("Profil")]
public string UserName { get; set; }
[Column("Mail")]
public string Email { get; set; }
public virtual Profil Profil {get;set;}
}
这就是你如何流利地做到这一点:
modelBuilder.Entity<Profil>()
.HasOptional(x => x.User) // User is optional for Profil
.WithRequired(z=>z.Profil); // but Profil is required for User