12

我正在使用 EF(dll 版本为 4.4)来查询数据库。该数据库包含几个包含课程信息的表格。当查看实际发送到数据库的内容时,我看到了一个庞大的、近 1300 行的 SQL 查询(由于它的大小,我不会在这里粘贴)。我在上下文中运行的查询如下所示:

entities.Plans
  .Include("program")
  .Include("program.offers")
  .Include("program.fees")
  .Include("program.intakes")
  .Include("program.requirements")
  .Include("program.codes")
  .Include("focuses")
  .Include("codes")
  .Include("exceptions")
  .Include("requirements")
where plans.Code == planCode
select plans).SingleOrDefault(); 

我想避免在从每个相关表中收集信息时返回服务器,但是对于如此大的查询,我想知道是否有更好的方法来做到这一点?

谢谢。

4

5 回答 5

1

有点晚了,但由于您的数据每天只更改一次,请考虑将您需要的所有内容放入索引视图中,并将此视图放入您的 EF 模型中。

于 2013-08-14T10:11:22.893 回答
0

当您执行预先加载时,如果您选择所需的实体,那么它就可以了。否则,您可以使用延迟加载,但正如您指定的那样,您不希望数据库往返,所以您可以避免它。

我建议,如果多次使用此查询,那么您可以使用编译查询。这样它就会提高性能。

如果需要,请通过此链接.. http://msdn.microsoft.com/en-us/library/bb896297.aspx

于 2013-05-25T04:36:20.087 回答
0

如果您正在使用DbContext,则可以使用.Local上下文上的属性来查看您的实体是否已被检索并因此附加到上下文。

如果查询之前已经运行并且您的根实体Plan已经基于Plan.Code == planId该上下文的生命周期。

本文可能有助于使用.Local.

于 2013-06-02T22:14:26.797 回答
0

您通常可以.Include()在 where 子句之后添加。这意味着您只提取与您想要的信息相匹配的信息,看看这是否会减少您的查询。

于 2013-04-22T03:28:16.397 回答
0

可以通过使用投影而不是拉回引用的实体来获得更简洁的 SQL 查询:Include

var planAggregate = 
 (from plan in entities.Plans
  let program = plan.Program
  let offers = program.Offers
  let fees = program.Fees
  //...
  where plan.Code == planCode
  select new {
    plan
    program,
    offers,
    fees,
    //...
  })
  .SingleOrDefault();

如果您在上下文中禁用延迟加载,这种查询将导致您的实体的导航属性被包含在您的查询中的实体填充。

(我只在 EF.dll v5.0 上对此进行了测试,但它在 EF.dll v4.4 上的行为应该相同,这只是 .NET 4.0 上的 EF5。当我使用这种模式而不是Include类似形状的模式进行测试时查询它从 500 行 SQL 中减少了大约 70 行。您的里程可能会有所不同。)

于 2013-07-25T16:16:03.487 回答