如何在EF Core / Dotnet Core中进行查询而不需要求助于加入

时间:2018-03-07 12:09:20

标签: entity-framework .net-core entity-framework-core

我有两张桌子:

// pseudo code:

class User {
  int UserID; // primary key
  string name;
  IEnumerable<Checklist> Checklists;
}

class Checklist {
  int ChecklistID; // primary key
  String name;
}

当我执行以下LINQ查询时:

        var result = from checklist in _context.Users
            where checklist.UserID == id 
            select checklist.Checklists;

它始终使用2个查询,一个用于UserID,然后一个用于选择+ JOIN:

Select .... from Users where ..UserID=@__ID
 .......
Select ... from Checklists C
INNER JOIN ( Select ... from User 
     where 
     UserID = @__id_0
     .....
) as T on C.UserID = T.UserID;

问题是我已经拥有了用户的ID,所以我宁愿让EF做一个简单的查询:

Select ... from Checklists where UserID = 1;

而不是使用它的ID查询用户,然后在Checklist的新查询中使用该UserID,其中UserID =该ID

2 个答案:

答案 0 :(得分:2)

在这方面,EF Core比EF6更灵活。除了明确定义的属性之外,它还允许您通过shadow properties方法在LINQ查询中使用EF.Property

  

在实体实例上寻址给定属性。当您想在LINQ查询中引用阴影状态属性时,这非常有用。

因此,您可以使用原始模型:

var result = from checklist in _context.Checklists
             where EF.Property(checklist, "UserId") == id;

当然,您总是可以在模型中添加显式导航和/或FK属性,但如果您不想这样做(导航或FK属性都不是必需的),最好使用此选项。

答案 1 :(得分:1)

导航属性是EF的支柱。因此,您的详细信息类应公开其外键属性。省略它们毫无意义。

class Checklist {
  int ChecklistID; // primary key

  int UserId { get; set; }  // Foreign Key, the std naming patterns will match these
  User User { get; set; }

  String name;
}