我有两张桌子:
// 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
答案 0 :(得分:2)
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;
}