我正在尝试将GUID作为字符串传递给Web服务,但是我遇到了一个障碍。 GUID作为UNIQUEIDENTIFIER
存储在SQL Server中,EF将其作为GUID提取。我想要做的是在我的查询中这样做:
var query = myEntities.Foo.Where(q => q.Id== Id)
.Select(bar =>
new Bar()
{ BString = bar.GUID }
);
现在,C#抛出了一个无法将System.Guid
转换为string
的构建错误,因此我认为您可以执行此操作:
{ BString = bar.GUID.ToString() }
甚至
{ BString = Convert.ToString(bar.GUID) }
但两者都以运行时异常结束:
有一个例外,它是System.NotSupportedException:LINQ to 实体无法识别方法'System.String ToString(System.Object)'方法,此方法无法翻译 进入商店表达。
所以我收集到这两种情况,它无法找出从UniqueIdentifier
到varchar
的T-SQL等价物。
除了检索对象之外,有没有办法解决这个问题,然后迭代我的返回集将每个对象复制到一个新对象并在那时转换guid->字符串?
感谢。
答案 0 :(得分:6)
将其转换为字符串 outside LINQ语句的查询部分。
var query = myEntities.Foo.Where(q => q.Id== Id).Select(r => r.GUID)
.AsEnumerable()
.Select(guid =>
new Bar()
{ BString = guid.ToString() }
);
.AsEnumerable()
是重要的部分:它将结果从IQueryable
转换为IEnumerable
,具有在数据库查询完成后在客户端上运行任何进一步操作的效果。 (您也可以在其位置使用.ToArray()
或.ToList()
。)
答案 1 :(得分:0)
如果不考虑性能,您可能应该按照自己的建议手动将GUID重新映射到字符串:
var query = from entity in myEntities.Foo
where entity.Id == Id
select new { GUID = entity.GUID };
var response = from item in query.ToList()
select new Bar { BString = item.GUID }
这与@Tim Rogers建议的类似,但明确分为两个查询。
我提出的另一个选项是编写一个存储过程,使用T-SQL的本地convert()
语句将GUID转换为字符串。这将解决EF无法自动将GUID映射到字符串的问题。
答案 2 :(得分:-1)
现在可以使用 new Guid(<your string>);
将字符串转换为 Guid,而不是将 Guid 转换为字符串。