【问题标题】:Is this a recommended way to use a Stored Procedure with Entity Framework 4?这是将存储过程与 Entity Framework 4 一起使用的推荐方法吗?
【发布时间】:2010-11-15 12:05:52
【问题描述】:

我的代码对数据库进行了两次往返,因为我不确定这是否是创建我的 POCO 集合的正确方法,因为某些特定的 SQL 代码,第一次往返会遇到存储过程。

场景

用户在 UI 中输入一些 AutoComplete 搜索查询。我的代码遇到了一个存储过程(它利用了 F*ull Text Search* - 因此我使用存储过程的原因)并返回了结果的所有distinct primary keys。这些返回到代码(我的IRepository class),然后我使用 EF 检索所有结果,以获取这些存储过程结果。

首先,我不知道如何在 Linq to Entities 中执行此操作:对于 Id 的集合,检索所有 Foo 实体。

其次,我正在对数据库进行两次往返。为什么?因为我不确定如何在第一次往返中检索到丰富的结果。该实体由几个POCO 类组成,并且还有两个ICollection 属性,等等...

这是我应该使用存储过程然后检索丰富的填充实体的正确方法吗?

我将快速创建一个虚拟类图来帮助解答任何问题。

public class Person
{
    string Name;
    int Age;
    ICollection<string> NickNames;
    ICollection<Foo> DonnoSomethingElses;
}

想法?

【问题讨论】:

    标签: .net sql-server entity-framework stored-procedures entity-framework-4


    【解决方案1】:

    嗯,这两次往返听起来像是一个可以避免的问题 - 你能不能这样做:

    WITH FullTextResults AS
    (
       SELECT ID, ...... --- do your full text search here
    )
    SELECT
       (list of fields) 
    FROM
       dbo.YourDataTable t
    INNER JOIN
       FullTextResults ftr ON t.ID = ftr.ID  -- join on primary key
    WHERE
       .....  -- possibly limit results
    

    然后从您的存储过程中返回此 CTE(公用表表达式)的输出??然后,这将返回一个包含实际数据表中的行和列的数据集,并且 EF 可以从中实现您的 Person 类.....

    【讨论】:

    • L 那个人 poco 有 2x ICollections 呢?这些集合也需要填充?
    • @Pure.Krome:如果需要,这些可能需要额外的往返来填充。不幸的是,EF 目前似乎不支持存储过程在一次调用中返回多个结果集
    • 干杯。这就是我害怕的-> EF 仅支持单个记录集。这就是为什么我需要进行 2 次往返。在您上面的示例中,我不需要执行 CTE,因为 EF 将生成完整、丰富(并且可能很大)的 sql 语句来填充 poco 及其所有子项(阅读:ICollections),我已向 @987654323 询问@。只是不确定如何在 Linq 中执行此操作...获取所有具有此 ID 集合中存在的 ID 的 Poco...
    猜你喜欢
    • 2011-06-27
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多