首页私人日誌EF中使用数据库的标量值函数

EF中使用数据库的标量值函数

admin 11-30 08:40 164次浏览

EF中使用数据库的标量值函数

数据库中的自定义函数,如果是表值函数,EF里面会自动加上代码,还算能寻到门路进行调用。

但如果是标量值函数呢?

从数据库里更新了模型以后,系统只在edmx里加了一句(右键,点打开方式,选XML方式可见):

这样叫人怎么用啊?可参考以下资料:

​​[test]goselect dbo.[talkrecord_f_GetCount]();

直接读取标量值函数的值,而不是用于过滤。这样子的话,仅参考上面那个例子,我怎么写也写不出来。

后来还是在老外的解答中找到了答案:

1、首先修改edmx里添加的这个,将IsComposable属性改为false,去掉ReturnType属性,然后添加子节点

select dbo.talkrecord_f_getcount()

怕,我的孩子,可以手动改成:

public virtual System.Data.Entity.Core.Objects.ObjectResult talkrecord_f_GetCount() { return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("talkrecord_f_GetCount"); }

2、双击打开edmx文件,右键,模型浏览器,展开****.store,存储过程/函数,选中心仪的函数,右键,导入,在弹出框中选标量,选参数值,确定。如此,系统终于肯为我们在***.context.cs里添加代码矣:

[csharp] ​​view plain​​​ ​​​copy​​ 1. public virtual System.Data.Objects.ObjectResult talkrecord_f_GetCount()2. {3. return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("talkrecord_f_GetCount");4. }

但烦恼还没结束。编译也许会报错:

无法将类型“System.Data.Entity.Core.Objects.ObjectResult”隐式转换为“System.Data.Objects.ObjectResult”

别怕,我的孩子,可以手动改成:

[csharp] ​​view plain​​​ ​​​copy​​ 1. public virtual System.Data.Objects.ObjectResult talkrecord_f_GetCount()2. {3. return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("talkrecord_f_GetCount");4. }

3、调用

[csharp] ​​view plain​​​ ​​​copy​​ 1. public static int GetCount()2. {3. int count = 0;4. using (Model.testEntities db = new Model.testEntities())5. {6. var first = db.talkrecord_f_GetCount().First().Value;7. int)first;8. }9. return count;10. }

参考资料:

​​http://stackoverflow /questions/12481868/how-to-use-scalar-valued-function-with-linq-to-entity​​

这些都是没有什么价值的工具使用类经验,在上面耗费时间,对技术本身并没有什么帮助,微软就是喜欢这样,搞了一大堆工具,并且还常常丢弃旧工具,然后出来更多的新工具,我们就是在这些工具里面疲于奔命,浪费青春,到头来,什么也没学到,知道的,只是一些如何使用微软工具的垃圾技能。这是我痛恨微软,抛弃微软,转向java的根本原因。

EF中使用数据库的标量值函数
Java反射及性能详细 初识Java一些常见的数据类型
相关内容