首页 新闻 会员 周边

使用Linq2Sql出现无法将Guid转换成Sql的错误.

0
悬赏园豆:10 [已解决问题] 解决于 2010-09-26 14:01

错误信息如下:

Bugu.UnitTest.EventRepositoryTest.TestEventRepository:
System.NotSupportedException : 成员“Bugu.Infrastructure.DomainBase.IEntity`1[System.Guid].Key”不支持转换为 SQL。

以下是我出错的代码.TEntity和Key是泛型类型

1 public virtual TEntity GetByKey(Key key)
2 {
3 var item = entityTable.Single(i => i.Key.Equals(key));
4
5 if (item == null)
6 return null;
7 var entity = entityFactory.Build(item);
8 entityBuilderAssistances(entity, item);
9
10 return entity;
11 }

连这个纠结的方法都用了,也不行...

item = entityTable.Single(i => new Guid(i.Key.ToString()) == new Guid(key.ToString()));

Snake@Net的主页 Snake@Net | 初学一级 | 园豆:130
提问于:2010-09-18 01:13
< >
分享
最佳答案
0

LINQ2SQL,和LINQ2OBJ不一样,使用的是Expression<>,entityTable.Single(i =>i.Key.Equals(key))当中的Single里面的会狗造成表达式树,这是编译器自动做的,但是运行时这个表达式树会 交给LINQ2SQL的Provider,Provider负责将表达式树使用SQL表示。所以你这里的i.Key调用的是MemberExpression(),但是Provider不知道如何转换你的Key到SQL,于是报错。

我想不到什么好的解决办法,或许(好像不是好办法)可以Key=>string做成存储过程proc,entityTable.Single(i =>proc(i).EqualskeyString)

收获园豆:10
neutra | 菜鸟二级 |园豆:450 | 2010-09-19 00:37
其实最后我在entityTable.AsEnumerable()之后就可以了.貌似这种泛型的比较不能在数据库上执行,只能提交到本地执行了.
Snake@Net | 园豆:130 (初学一级) | 2010-09-26 14:05
id是主键,一般来说表的行数比较多的时候,如果使用entityTable.AsEnumerable()在本地来筛选会导致性能问题,因为实际上你将整张表的数据都加载了,当然数据少倒无妨
neutra | 园豆:450 (菜鸟二级) | 2010-09-26 14:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册