C# 与“正常”方式相比(如果存在导航属性)。@Evk几乎相同。由于模型中不清楚是否需要FK列,因此按照惯例EF认为FK列是可选的,因此仅以正常方式生成左侧外部联接而不是内部联接。因此,为了使它们完全相同,LINQ查询应该以更丑陋的方式编写。 public cl
C# 与“正常”方式相比(如果存在导航属性)。@Evk几乎相同。由于模型中不清楚是否需要FK列,因此按照惯例EF认为FK列是可选的,因此仅以正常方式生成左侧外部联接而不是内部联接。因此,为了使它们完全相同,LINQ查询应该以更丑陋的方式编写。 public cl,c#,entity-framework,C#,Entity Framework,与“正常”方式相比(如果存在导航属性)。@Evk几乎相同。由于模型中不清楚是否需要FK列,因此按照惯例EF认为FK列是可选的,因此仅以正常方式生成左侧外部联接而不是内部联接。因此,为了使它们完全相同,LINQ查询应该以更丑陋的方式编写。 public class Team { [Key] public int Id { get; set; } public string Name { get; set; } public List<Member> Me
与“正常”方式相比(如果存在导航属性)。@Evk几乎相同。由于模型中不清楚是否需要FK列,因此按照惯例EF认为FK列是可选的,因此仅以正常方式生成
左侧外部联接
而不是内部联接
。因此,为了使它们完全相同,LINQ查询应该以更丑陋的方式编写。
public class Team {
[Key]
public int Id { get; set; }
public string Name { get; set; }
public List<Member> Members { get; set; }
}
public class Member {
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
public class Pet {
[Key]
public int Id { get; set; }
public string Name { get; set; }
public Member Member { get; set; }
}
public class PetViewModel {
public string Name { get; set; }
public string TeamItIndirectlyBelongsTo { get; set; }
}
public PetViewModel[] QueryPetViewModel_1(string pattern) {
using (var context = new MyDbContext(connectionString)) {
return context.Pets
.Where(p => p.Name.Contains(pattern))
.ToArray()
.Select(p => new PetViewModel {
Name = p.Name,
TeamItIndirectlyBelongsTo = "TODO",
})
.ToArray();
}
}
public PetViewModel[] QueryPetViewModel_2(string pattern) {
using (var context = new MyDbContext(connectionString)) {
var petInfos = context.Pets
.Where(p => p.Name.Contains(pattern))
.Join(context.Members,
p => p.Member.Id,
m => m.Id,
(p, m) => new { Pet = p, Member = m }
)
.ToArray();
var result = new List<PetViewModel>();
foreach (var info in petInfos) {
var team = context.Teams
.SingleOrDefault(t => t.Members.Any(m => m.Id == info.Member.Id));
result.Add(new PetViewModel {
Name = info.Pet.Name,
TeamItIndirectlyBelongsTo = team?.Name,
});
}
return result.ToArray();
}
}
var result = (
from team in context.Teams
from member in team.Members
join pet in context.Pets on member.Id equals pet.Member.Id
where pet.Name.Contains(pattern)
select new PetViewModel
{
Name = pet.Name,
TeamItIndirectlyBelongsTo = team.Name
}).ToArray();