Show me the code,including sp.
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#代码是添加实体数据模型时生成的
@NoSaleNoKilling: ObjectContext.ExecuteFunction<YourEntity>试试看,这个泛型方法是支持返回结果集的。
@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); }
但我不知道那个存储过程哪里出问题了?
@JeffWong: 向你说的那样调用ExecuteFunction<YourEntity>会报错的,因为他返回的不是类型
@NoSaleNoKilling: 如果仅仅是查询,可以通过DbSet<Entity>.SqlQuery()方法。
@JeffWong: 好吧,我知道这种方法,但是想弄清楚是怎么回事
@NoSaleNoKilling: ExecuteFunction<YourEntity>,你可以参考这里的示例
@JeffWong: 貌似是存储过程使用了sp_executesql 方法,这个方法的返回值为0和非零,所以返回的就是一个int,但只是猜,thank you all the same!
@NoSaleNoKilling: ObjectContext.ExecuteFunction<prcTestModify_Result>("prcTestModify", keyWordParameter)加一下.ToList()方法试一下,除此之外,真是看不出SP有什么毛病。
@NoSaleNoKilling: 不是说这个sp_executesql,SP直接写查询为什么得不到结果呢?奇怪了。
@JeffWong: 用db.DataBase.SqlQuery没有问题
你是如何调用存储过程的?
生成实体数据模型的时候,勾选这个会生成方法
我是来参观这个存储过程的,写存储过程的这位小哥大才啊,
建议转JAVA发展。
为什么?
@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一下。
感觉这个世界不会对你这样残酷的。
@爱编程的大叔: thank you all the same!
@爱编程的大叔:
感觉这个世界不会对你这样残酷的!!!!!