在这种情况下,EntityFramework是否足够智能来触发一个查询而不是两个查询?

时间:2012-07-27 09:57:24

标签: entity-framework-4

我有一个现有的控制器动作,如下所示。

Public Function List(ByVal UserID As Integer, Optional ByVa; Filter As String = Nothing) As ActionResult
    Dim records

    If Filter IsNot Nothing Then
        records = context.Contacts.Where(Function(x) x.UserID = UserID and x.Name.Contains(Filter))
    Else
        records = context.Contacts.Where(Function(x) x.UserID = UserID)
    End If

    return View(records)
End Function

我希望简化如下。

Public Function List(ByVal UserID As Integer, Optional ByVa; Filter As String = Nothing) As ActionResult
    Dim records = context.Contacts.Where(Function(x) x.UserID = UserID)

    If Filter IsNot Nothing Then
        records = records.Where(Function(x) x.Name.Contains(Filter))
    End If

    return View(records)
End Function

如果通过过滤器,它是否会触发两个查询,或者它是否足够智能以仅触发一个查询?

2 个答案:

答案 0 :(得分:1)

试一试,看看!

启动SQL Management Studio(或类似版本)并加载SQL事件探查器,连接到数据库并查看有哪些传入查询。

理论上,没有理由为什么EF4不能将其作为单个op运行,因为直到第二次应用where子句之后才会发出数据请求。

  • 构建查询
  • 添加where子句
  • 添加第二个where子句
  • 执行数据检索

答案 1 :(得分:0)

是的,一个查询 - 这是IQueryable接口的本质。在访问IQueryable的枚举器之前,返回IQueryable 的所有方法都不会执行任何操作。