【问题标题】:Linq vs. database viewsLinq 与数据库视图
【发布时间】:2009-01-05 18:57:31
【问题描述】:

这是一个有趣的问题。假设我们在数据库中有相关的表,例如 Instrument 和 Currency。 Instrument 表有一个 currency_id 字段,该字段映射到 Currency 表中的条目。在 Linq 土地上有什么更好的方法:

a) 在 DataContext 中创建 Instrument 和 Currency 实体,然后创建关联或简单地在 Linq 查询中使用 join 或

b) 在连接 Instrument 和 Currency 的数据库中创建一个视图(从而将 currency_id 解析为货币代码)并将其用作 Linq 上下文中的实体?

【问题讨论】:

    标签: database linq performance views


    【解决方案1】:

    你会独立使用它们吗?如果是这样,您将需要为每个将独立使用的实体。我怀疑您将独立使用货币(例如,允许您在创建工具时选择货币的下拉菜单)。既然如此,我认为将它们分开并建立关联会更容易。

    【讨论】:

    • 但是性能怎么样,如果我不使用 view linq 会为每一行做额外的选择?
    • 不一定,LINQ 表达式通常会解析为将在 SQL 中执行所需连接的单个选择。
    • 我不这么认为,我在这种情况下使用了 sql profiler 并看到 linq 为每一行选择:(
    • 有趣的是,如果 LINQ 严重损害性能,那么它的生命周期就会很短。也许您应该在另一个问题中发布示例并问“为什么这对每一行使用一个选择而不是一个带有连接的选择?”
    • 您是否在其他地方发布了问题,如果是,结果如何,您可以发布链接吗?我想知道完全相同的事情:)
    【解决方案2】:

    现在 ORM 将数据访问逻辑抽象化,不再需要特定的视图功能。最好将其留给 ORM,因为这是它的功能的一部分。

    但是视图对于简化存储过程代码甚至创建有用的索引可能仍然有用。

    【讨论】:

    • 但是性能呢,我在 sql profiler 中看到 linq 为每一行做额外的选择
    【解决方案3】:
    • 如果您在 Instrument 中加载,然后使用 Currencies 属性加载相关 Currencies,则会出现两个查询。

    • 如果您发出带有连接的 linq 查询,linq 会将其转换为带有连接的 sql,并且您会立即获取所有数据。

    • 如果设置了 DataLoadOptions,则可以在一个查询中获取所有数据,而不必编写联接。

    http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.aspx http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx

    DataLoadOptions dlo = new DataLoadOptions();
    dlo.LoadWith<Instrument>(i => i.Currencies)
    myDataContext.LoadOptions = dlo;
    

    【讨论】:

      【解决方案4】:

      我发现 LINQ 是喜怒无常的。我可以间隔 1 分钟运行相同的查询并得到不同的结果。注意我正在使用本地数据库,所以我知道数据没有改变。在我的选择中,使用带有数据集的视图要可靠得多,尤其是在连接时。

      【讨论】:

      • 我不明白这是如何回答这个问题的。如果您想获得对您的观察的反馈,请将其作为问题发布,而不是作为答案发布。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多