让我解释一下自己。
在LINQ的帮助下,我向数据库请求了一个对象:
int idGetClient=1;
Client clientToUpdate = context.Client.FirstOrDefault(p=>p.idClient == idGetClient);
在我的模型中,客户端与另一个名为Site的对象相关。所以我只需调用:
就可以轻松地从我的SQL数据库中获取我的Site对象Site siteToUpdate = clientToUpdate.Site;
所以我想知道这里发生了什么,LINQ ALREADY在我的第一个请求中加载了结果还是请求再次接收我的客户信息并查找我的数据库?
第二个看起来对我来说最合乎逻辑,但我想确定,因为如果第一个案例会发生什么,它会导致一些性能问题。
答案 0 :(得分:3)
假设您正在使用实体框架,您可以自己挂钩sql语句并查看访问对象时发生的情况 - 例如
context.Database.Log = Console.Write;
还可以使用include:
确保加载关系context.Client.Include("Site").FirstOrDefault(p=>p.idClient == idGetClient);
答案 1 :(得分:3)
如果未指定任何其他内容,则您的属性Site
将被延迟加载,因此在您尝试访问该属性时,Entity将查询数据库服务器。
如果对数据库服务器的第二次访问会导致性能问题,则可以使用以下命令阻止:
int idGetClient=1;
Client clientToUpdate = context.Client
.Include("Site")
.FirstOrDefault(p=>p.idClient == idGetClient);
您可以根据需要添加任意数量的Include,甚至可以加载属性的属性:
int idGetClient=1;
Client clientToUpdate = context.Client
.Include("Site")
.Include("Site.SubProperty")
.FirstOrDefault(p=>p.idClient == idGetClient);
Include将强制加载指定属性。
答案 2 :(得分:1)
在大多数情况下,导航属性.Site
会导致Site
对象延迟加载。即:发出特定的数据库查询。
问题在于细节上有点稀缺,所以我认为:
.Site
是一个导航属性,表示与数据库中另一个表的关系。我建议使用SQL事件探查器查看实际向数据库发出的查询(有关原因的原因,请参阅this blogpost。)