如何用给定的过滤器实现EF内连接?

时间:2015-09-18 07:57:16

标签: entity-framework

SELECT DISTINCT k.* FROM [dbo].[kinds] K 
INNER JOIN KindGraphic KG ON K.KindId = KG.KindId
INNER JOIN Graphics G ON KG.GraphicId = G.GraphicId
WHERE K.CategoryType = 2
AND G.IsSpecial = 1

如何在EF中写这个?我是EF的新手。我使用dbContex作为我的MVC项目。

  

请注意" KindGraphic" table以这种方式映射

因此我无法使用此方法https://stackoverflow.com/a/21986882/3264939

 modelBuilder.Entity<Kind>()
                .HasMany(c => c.Graphics)
                .WithMany(g => g.Kinds)
                .Map(t => t.MapLeftKey("KindId")
                    .MapRightKey("GraphicId")
                    .ToTable("KindGraphic"));

1 个答案:

答案 0 :(得分:1)

原始查询的结果是某种复杂的结果。因此,如果不选择确切的列(而不是使用*),我假设结果包含在这样的匿名类型中:

{
    Kind,        
    Graphic
}

我了解KindGraphic是某种联结(加入)表,因此在结果中包含的信息并不重要(我们可以从{{1}访问KindId和来自Kind的{​​{1}}。这是LINQ查询:

GraphicId

在您使用Graphic进行修改后,您可以翻译查询,因为您希望所有var result = context.kinds.Where(e => e.CategoryType == 2) .SelectMany(e=> e.Graphics.Where(g=>g.IsSpecial == 1), (e, g) => new { Kind = e, Graphic = g} ); 类型类型为distinct,任何图形均为kinds。所以它应该是这样的:

2