首页 新闻 会员 周边

Entity Framework 6.0 DbFirst 生成的存储过程方法返回值为什么都是int类型?

0
悬赏园豆:200 [已解决问题] 解决于 2015-06-26 09:04

 DbFirst 生成的存储过程方法返回值都是int?? 在数据库中执行存储过程返回的结果集,这是怎么回事?

BornReady的主页 BornReady | 初学一级 | 园豆:7
提问于:2015-06-25 15:45
< >
分享
最佳答案
0

Show me the code,including sp.

收获园豆:80
JeffWong | 老鸟四级 |园豆:2328 | 2015-06-25 16:25
CREATE PROCEDURE [dbo].[prcTest]
    @KeyWord varchar(512)                        --关键词
AS
BEGIN

    SET NOCOUNT ON

    DECLARE
        @KeyWordID INT,
        @IDPartition INT,
        @where NVARCHAR(4000),
        --@strMonth NVARCHAR(4000),
        @SQL NVARCHAR(max)

    select @KeyWordID = ID from RDAS.dbo.D_KeyWord where [KeyWord]=@KeyWord

    SET @IDPartition=RDAS.dbo.funGetIDByKeyWordID(@KeyWordID)

    SET @SQL = 'SELECT [KeyWordID],[UserID],[UserExpense] as [Expense],[Profession]
    FROM [RDAS_Core].[dbo].[T_User_Expense_Count_'
    +right('00000'+convert(varchar(5),@IDPartition),5)+'] where [KeyWordID] = @KeyWordID
    order by [Expense] desc'

    --SELECT @SQL
    EXEC sp_executesql @SQL, N'@KeyWord varchar(512),@KeyWordID int',
    @KeyWord ,@KeyWordID--,@startyear,@startmonth,@endyear,@endmonth,@KeyWordID
END
        public virtual int prcTest(string keyWord)
        {
            var keyWordParameter = keyWord != null ?
                new ObjectParameter("KeyWord", keyWord) :
                new ObjectParameter("KeyWord", typeof(string));

            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("prcTest", keyWordParameter);
        }

c#代码是添加实体数据模型时生成的

BornReady | 园豆:7 (初学一级) | 2015-06-25 16:33

@NoSaleNoKilling: ObjectContext.ExecuteFunction<YourEntity>试试看,这个泛型方法是支持返回结果集的。

JeffWong | 园豆:2328 (老鸟四级) | 2015-06-25 16:41

@JeffWong:

修改存储过程,测试用的所以就修改成这样

CREATE PROCEDURE [dbo].[prcTestModify]
    @KeyWord varchar(512)                        --关键词
AS
BEGIN
    SELECT [KeyWordID],[UserID],[UserExpense] as [Expense],[Profession]
    FROM [RDAS_Core].[dbo].[T_User_Expense_Count_00033]
        where [KeyWordID] = @KeyWord
    order by [Expense] desc
END

GO
生成这样的代码,是我想要的结果       

 public virtual ObjectResult<prcTestModify_Result> prcTestModify(string keyWord)
        {
            var keyWordParameter = keyWord != null ?
                new ObjectParameter("KeyWord", keyWord) :
                new ObjectParameter("KeyWord", typeof(string));
    
            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<prcTestModify_Result>("prcTestModify", keyWordParameter);
        }

但我不知道那个存储过程哪里出问题了?

BornReady | 园豆:7 (初学一级) | 2015-06-25 16:51

@JeffWong: 向你说的那样调用ExecuteFunction<YourEntity>会报错的,因为他返回的不是类型

BornReady | 园豆:7 (初学一级) | 2015-06-25 16:58

@NoSaleNoKilling: 如果仅仅是查询,可以通过DbSet<Entity>.SqlQuery()方法。

JeffWong | 园豆:2328 (老鸟四级) | 2015-06-25 17:02

@JeffWong: 好吧,我知道这种方法,但是想弄清楚是怎么回事

BornReady | 园豆:7 (初学一级) | 2015-06-25 17:07

@NoSaleNoKilling: ExecuteFunction<YourEntity>,你可以参考这里的示例

JeffWong | 园豆:2328 (老鸟四级) | 2015-06-25 17:08

@JeffWong: 貌似是存储过程使用了sp_executesql 方法,这个方法的返回值为0和非零,所以返回的就是一个int,但只是猜,thank you all the same!

BornReady | 园豆:7 (初学一级) | 2015-06-25 17:24

@NoSaleNoKilling: ObjectContext.ExecuteFunction<prcTestModify_Result>("prcTestModify", keyWordParameter)加一下.ToList()方法试一下,除此之外,真是看不出SP有什么毛病。

JeffWong | 园豆:2328 (老鸟四级) | 2015-06-25 17:25

@NoSaleNoKilling: 不是说这个sp_executesql,SP直接写查询为什么得不到结果呢?奇怪了。

JeffWong | 园豆:2328 (老鸟四级) | 2015-06-25 17:28

@JeffWong: 用db.DataBase.SqlQuery没有问题

BornReady | 园豆:7 (初学一级) | 2015-06-25 18:35
其他回答(2)
0

你是如何调用存储过程的?

收获园豆:60
dudu | 园豆:30994 (高人七级) | 2015-06-25 16:15

生成实体数据模型的时候,勾选这个会生成方法

 

支持(0) 反对(0) BornReady | 园豆:7 (初学一级) | 2015-06-25 16:36
1

我是来参观这个存储过程的,写存储过程的这位小哥大才啊,

建议转JAVA发展。

收获园豆:60
爱编程的大叔 | 园豆:30839 (高人七级) | 2015-06-25 16:37

为什么?

支持(0) 反对(0) BornReady | 园豆:7 (初学一级) | 2015-06-25 17:02

@NoSaleNoKilling: 

1、我第一眼看到这个存储过程,就知道他是返回的Int,而不会返回你需要的Model。

因为SQL Server不知道。

2、后来再仔细看一下,也许你在做一个很大的系统(比如12306)之类的,也许真的有必要这样写呢,

那么有没有EF的解决方案呢,还是只能转回使用ADO.NET。

3、我很少这样用,不过决定为你Google一下,StackOverFlow上面还是有人说了一些答案,

我琢磨着还是有点靠谱。

4、首先,你得知道SQL SERVER有个Execute Time,还有个Parse Time的概念。

而Entity Framework的设计器明显只用到了Execute Time,

然而Execute Time对于Dynamic SQL Execution并没有什么鸟用。

5、这时候有人说 

SET FMTONLY OFF

我只能做到这儿了,没有测试,不过我建议你还是多Google一下。

感觉这个世界不会对你这样残酷的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2015-06-25 17:27

@爱编程的大叔: thank you all the same!

支持(0) 反对(0) BornReady | 园豆:7 (初学一级) | 2015-06-25 18:36

@爱编程的大叔: 

感觉这个世界不会对你这样残酷的!!!!!

 

支持(0) 反对(0) Froyo | 园豆:494 (菜鸟二级) | 2015-06-26 11:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册