【问题标题】:How does .Net handle the connection in LINQ-To-Entity inside using context?.Net 如何使用上下文处理 LINQ-To-Entity 中的连接?
【发布时间】:2014-05-22 15:42:21
【问题描述】:

我在我的项目中使用 Linq-To-Entity。但是,在某些情况下,我会犹豫使用Stored ProcedureLINQ to Table or View。但是,由于 pleasent 语法,我通常更喜欢使用 LINQ。我已经搜索了谷歌,但没有找到我的问题的详细答案。

让我们考虑一下这段代码:

using (NorthwindEntities db = new NorthwindEntities())
{
    var custs = from c in db.Customers where c.City == "London" select c;
    var edus = from c in db.Educations where c.Education != "2" select c;
    // ... and so on
}

问题
1. 它是否为每个查询打开一个新连接?如果是这样,那么不建议单独使用上述查询吗?
2. 另外,您能否建议我在任何情况下我必须使用存储过程而不是 LINQ?

【问题讨论】:

  • 当查询对 linq 来说太复杂(不可读)或不支持 EF 中的空间类型等某些内容时,我使用了 sproc 而不是 linq。另请阅读:stackoverflow.com/questions/14530/…
  • 您必须在 EF 中使用存储过程的唯一情况是您想使用 EF 不支持的东西。一个示例是使用全文搜索命令(例如 CONTAINS),或者如果您需要在 xml 列上编写 XPath 查询。

标签: c# linq entity-framework


【解决方案1】:

它是否为每个查询打开一个新连接?

有点。

根据the documentation

当调用查询方法时,连接被打开,并保持打开状态,直到 ObjectResult 被完全消耗或释放。

但是,连接是由 .NETpooled 的,因此相同的连接 object 将被重用(我假设必要时重新打开)。

请注意,只有在您枚举查询(使用 foreachToListToArraySingleFirst 等)之前,查询才会执行。在那之前这只是一个查询。这意味着你必须上下文被释放之前对查询做一些事情,否则你会得到一个异常。

在任何情况下我必须使用存储过程而不是 LINQ?

如果您的查询过于复杂而无法使用 Linq 构造,那么存储过程是一个合理的替代方案。

【讨论】:

  • 小挑剔但AsEnumerable 不执行查询。
  • @Dismissile True - 我已将其删除。
  • @DStanley 谢谢你的回答。那么这是否意味着我的问题的其他两个答案是错误的?此外,从文档看来,我可以明确地打开和关闭连接。你有这方面的信息吗? context.Connection.Open();context.Connection.Close();
  • 是的,您可以,但您为什么要这样做? EF 旨在有效管理连接 - 除非您知道存在问题,否则不要尝试自行修复。
  • @Dstanley 好的。我接到你了。然后,假设我将使用我的问题中的示例代码来执行 10 个查询。从你所说的,这意味着使用 SP 会比 LINQ 更快。因为,LINQ 会重新打开连接。如果我执行 100 次查询,差异会很大。我是真的吗?
【解决方案2】:

在初始化新上下文时,它在构造函数中执行此操作。

NorthwindEntities db = new NorthwindEntities();

【讨论】:

    【解决方案3】:

    LINQ 在您初始化上下文时打开一个连接。

    NorthwindEntities db = new NorthwindEntities()
    

    当您的context 被处置时,它将被关闭。

    【讨论】:

    • 您确定它们何时打开?我找到的文档指出执行查询时打开了。
    • @DStanley 阅读您的回答后,我确实有疑问。我想我对此的想法是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多