首页 新闻 赞助 找找看

向高人请教:有没办法既可以解决EF的linq语句中字段无法使用C#方法的异常,又能保持它延迟执行的特性?

0
悬赏园豆:50 [已关闭问题] 关闭于 2013-12-16 10:49

向高人请教:有没办法既可以解决EF的linq语句中字段无法使用C#方法的异常,又能保持它延迟执行的特性?

  我知道。如何将IQueryable<>对象 toList()后,便无异常。只是这样做就破坏了它原有延迟执行的特性。所以,一直找不到更好的解决方案。望高手赐教!万分感激!

具体代码如下:

问题补充:

忘了一点。也不要将代码中oldName转化成Guid类型。我就是想知道,倒底有没有方法来弥补延迟语句中的不足?使它变得更灵活。谢谢

ChenYa.Liu的主页 ChenYa.Liu | 初学一级 | 园豆:3
提问于:2013-12-11 15:23
< >
分享
所有回答(5)
0

可以试试 SqlFunctions.StringConvert 如

using System.Data.Objects.SqlClient;

where SqlFunctions.StringConvert((int)c.id)==oldName

Zery | 园豆:6151 (大侠五级) | 2013-12-11 15:43

我试过了。没用。

我那个字段比较特殊。是Guid类型的。

支持(0) 反对(0) ChenYa.Liu | 园豆:3 (初学一级) | 2013-12-11 15:48

@ChenYa.Liu: 那再试试 linq to entity的where 方法 在里边toString试试,另外看你代码中紧接着就是一个Count()的操作与ToList是一个性质的,会立即执行

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2013-12-11 16:23

@Zery:  where方法也不行。里面存的也是表达式树结构。你说哪个count(),自然和上面使用ToList()的性能没法比。

支持(0) 反对(0) ChenYa.Liu | 园豆:3 (初学一级) | 2013-12-11 16:45

@ChenYa.Liu: 

var temp= from A in db.Photo

from B in db.Share

where System.Data.Linq.SqlClient.SqlMethods.Equals(A.Content,B.Id.ToString())

select{......};

这样据说可以 ,对于 Count我是说与Tolist一样都会立即执行查询也是属于非延迟查询,因为它的返回结果类型已经是IEnumerable 类型的了

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2013-12-11 17:18

@Zery: 大侠,你给的方法还是不行啊!

支持(0) 反对(0) ChenYa.Liu | 园豆:3 (初学一级) | 2013-12-12 11:31

@ChenYa.Liu: 那就把oldName 转成与Id一样的类型

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2013-12-12 12:19

@Zery:  我就是想知道,倒底有没有这样的方法。或者是更底层的去更改它!而把oldName转过来,我现在用的就是这个办法。不过。我还是好奇。你可以再帮我想想吗?究竟这个EF执行时都做了些什么?在它翻译成SQL时,有没有什么办法注入代码。或者是什么事件之类的...

支持(0) 反对(0) ChenYa.Liu | 园豆:3 (初学一级) | 2013-12-12 12:38

@ChenYa.Liu: 

个人认为EF内部把linq 转sql 的方法不会公开的,目的就是避免人为的破坏原有的完整性。要想知道是怎么转的可以反编译去查看,能不能修改生成的sql的代码这个你大胆的去探索吧.

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2013-12-12 13:24
0

Lazy

幕三少 | 园豆:1384 (小虾三级) | 2013-12-11 16:02
0

这与EF linq、延迟没有关系吧。我估计你的问题是你的guid是可空类型的,然后c.旧ID.Value.Tostring才出错的。你这样写试一试:

where c.旧ID.HasValue && c.旧ID.Value.ToString()==oldName select c;

junjieok | 园豆:779 (小虾三级) | 2013-12-11 16:03

无语

支持(0) 反对(0) ChenYa.Liu | 园豆:3 (初学一级) | 2013-12-11 16:06
0

where  System.Data.Linq.SqlClient.SqlMethods.Equals(c.旧ID.Value.ToString(),oldName)

Launcher | 园豆:45045 (高人七级) | 2013-12-11 16:54

支持(0) 反对(0) ChenYa.Liu | 园豆:3 (初学一级) | 2013-12-12 11:35

@ChenYa.Liu: 那就不行了,EF 没法将 System.Data.Linq.SqlClient.SqlMethods 编译成 SQL 语句。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2013-12-12 11:40
0
幻天芒 | 园豆:37175 (高人七级) | 2013-12-12 00:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册