实体框架和存储过程返回临时表问题

时间:2012-03-18 17:07:56

标签: sql-server entity-framework temp-tables

(免责声明 - 我不是数据库设计师。我只是可怜的开发人员必须做的工作。)

目前有17个(目前)表格具有相同的结构 - 名称,地址,电话号码。

给定一个电话号码,我必须检查是否有任何表中的匹配条目,然后返回该地址。

所以,我创建了一个视图来获取表的列表(那里有一个包含该信息的ref表),然后我创建了一个存储过程

  1. 创建一个临时表,
  2. 使用游标,使用sql concatenation检查视图中的每个表的电话号码。如果找到记录,请将其插入临时表。
  3. 返回临时表中的行。
  4. 这一切都适用于直接的T-SQL。

    现在,我尝试使用Entity Framework 4+来调用存储过程。但是函数导入界面不会生成列。它表示返回类型=无,LINQ代码需要一个int并且不会编译。

    有关如何使这项工作的任何想法?

    我知道我可以将检查表部分移动到代码中,如果我必须这样做,但我宁愿使用上述方法。

4 个答案:

答案 0 :(得分:4)

获取有关存储过程的信息的EF默认方式仅询问“元数据” - 它不执行查询或数据修改命令。因为EF无法使用临时表,dynaimc SQL等接收有关存储过程的信息,因为这些信息在命令真正执行之前是未知的。

作为一种解决方法,您可以修改您的程序,并在开始时

SET FMTONLY OFF

仅当您尝试将存储过程导入数据库并确保存储过程不对数据库进行任何修改时才使用此方法,因为每次尝试导入或更新实体中的存储过程时都会执行这些修改模型。

答案 1 :(得分:3)

添加此非逻辑代码块可解决此问题。即使它永远不会命中

IF 1=0 BEGIN
    SET FMTONLY OFF
END

Why does my typed dataset not like temporary tables?

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataset/thread/fe76d511-64a8-436d-9c16-6d09ecf436ea/

答案 2 :(得分:2)

这是一个彻头彻尾的黑客,但我过去曾使用它来使用具有复杂存储过程的实体框架。它利用了实体框架在创建镜像返回的数据集的类型时使用NULL参数值这一事实。做一个简单的IF(参数是NULL)和一个与你将要返回的匹配的假返回数据集。

ALTER proc [dbo].[cust_auto_doc_list_invoice]
@interval_ref integer
AS
SET NOCOUNT ON;

IF @interval_ref IS NULL
BEGIN
-- This is to fool the edmx generator.
    SELECT CONVERT(integer,0) as group_ref,
        CONVERT(varchar(50),'') as group_name,
        CONVERT(integer,0) as wloc_ref,
        CONVERT(decimal(18,0),0) as invoice_ref,
        CONVERT(decimal(10,0),0) as cust_ref,
        CONVERT(varchar(50),'') as cust_name,
        CONVERT(decimal(10,0),0) as csnee_ref,
        CONVERT(varchar(50),'') as csnee_name
END
ELSE
BEGIN
  -- Do real work here
END

- 汤姆

答案 3 :(得分:0)

我不知道EF部分的解决方案,但在数据库中我只是创建以下视图:

select * from Table1
union all select * from Table2
union all select * from Table3
union all select * from Table4
...

然后您可以使用EF查询您喜欢的视图。不需要游标等。