正在使用实体框架将guid转换为字符串
本文关键字:guid 转换 字符串 框架 实体 | 更新日期: 2023-09-27 18:25:15
我正试图将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->string之外,还有什么方法可以解决这个问题吗?
谢谢。
将其转换为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()
代替它。)
如果性能不是问题,您可能应该手动将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映射到字符串的问题。
现在可以使用new Guid(<your string>);
将字符串转换为Guid,而不是将Guid转换为字符串。