2

我正在使用 Entity Framework Code Fist 设置一个新应用程序,并且正在寻找尝试尽可能减少到 SQL Server 的往返次数的方法。

当我第一次在这里读到 .Local 属性时,我很兴奋可以在处理管道的早期关闭整个对象图,然后在以后使用 .Local ,而不必担心会产生额外的往返成本。

现在我正在玩它,我想知道是否有任何方法可以在一次往返中删除单个请求所需的所有数据。例如,如果我有一个网页,上面有一些列表、新闻、事件和讨论。有没有一种方法可以在一次往返中将他们 3 个不相关的源表的记录记录到 DbContext 中?互联网上的所有人都认为单个页面与数据库服务器进行 20 次往返是完全没问题的吗?我想通过适当的缓存机制可以缓解这个问题。

在一次往返中从EF查询返回多个结果时,我确实遇到了一些问题,但我不确定这些解决方案的复杂性和成熟度是否值得。

一般来说,在组合要传递给 MVC 控制器的数据集方面,您是否认为最好对您需要的每组记录进行单独的查询,然后使用EF 缓存来担心缓存层的大部分性能提供程序或 asp.net 缓存?

4

3 回答 3

3

如果需要,可以进行多次 DB 调用。如果您害怕多次往返,您可以编写存储过程并返回多个结果集(不适用于默认 EF 功能)或异步执行查询(同时运行多个分离查询)。无法使用单个 linq 查询加载 unrealted 数据。

再通知一个。如果您决定使用异步方法,请确保在每个异步执行中使用单独的上下文实例。异步执行使用单独的线程,上下文不是线程安全的。

于 2011-03-30T16:21:05.400 回答
0

如果您还没有性能问题,我认为您做了很多工作却收效甚微。是的,注意你在做什么,不要打不必要的电话。每个查询的实际连接和跨线开销通常非常低,所以不用担心。

记住“过早的优化是万恶之源”。

于 2011-03-30T16:03:13.713 回答
0

我的经验法则是,对您要检索的每个对象集合执行调用是可以的。为要检索的每一行执行调用是不好的。如果您的网页需要 20 个集合,那么 20 个调用就可以了。

话虽如此,如果您使用 Translate 方法,将其减少到一次调用并不困难。像这样的代码会起作用

var reader = GetADataReader(sql);
var firstCollection = context.Translate<whatever1>(reader);
reader.NextResult();
var secondCollection = context.Translate<whateve2r>(reader);
etc

这样做的最大缺点是,如果您将 sql 放入存储过程中,那么您的存储过程将变得非常特定于您的网页,而不是更通用。只要您可以很好地访问数据库,这并不是世界末日。否则你可以在代码中定义你的 sql。

于 2011-08-16T00:42:39.040 回答