可以试试 SqlFunctions.StringConvert 如
using System.Data.Objects.SqlClient;
where SqlFunctions.StringConvert((int)c.id)==oldName
我试过了。没用。
我那个字段比较特殊。是Guid类型的。
@ChenYa.Liu: 那再试试 linq to entity的where 方法 在里边toString试试,另外看你代码中紧接着就是一个Count()的操作与ToList是一个性质的,会立即执行
@Zery: where方法也不行。里面存的也是表达式树结构。你说哪个count(),自然和上面使用ToList()的性能没法比。
@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 类型的了
@Zery: 大侠,你给的方法还是不行啊!
@ChenYa.Liu: 那就把oldName 转成与Id一样的类型
@Zery: 我就是想知道,倒底有没有这样的方法。或者是更底层的去更改它!而把oldName转过来,我现在用的就是这个办法。不过。我还是好奇。你可以再帮我想想吗?究竟这个EF执行时都做了些什么?在它翻译成SQL时,有没有什么办法注入代码。或者是什么事件之类的...
@ChenYa.Liu:
个人认为EF内部把linq 转sql 的方法不会公开的,目的就是避免人为的破坏原有的完整性。要想知道是怎么转的可以反编译去查看,能不能修改生成的sql的代码这个你大胆的去探索吧.
Lazy
这与EF linq、延迟没有关系吧。我估计你的问题是你的guid是可空类型的,然后c.旧ID.Value.Tostring才出错的。你这样写试一试:
where c.旧ID.HasValue && c.旧ID.Value.ToString()==oldName select c;
无语
where System.Data.Linq.SqlClient.SqlMethods.Equals(c.旧ID.Value.ToString(),oldName)
@ChenYa.Liu: 那就不行了,EF 没法将 System.Data.Linq.SqlClient.SqlMethods 编译成 SQL 语句。