使用实体框架将guid转换为字符串

时间:2012-02-20 15:42:36

标签: c# entity-framework

我正在尝试将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)'方法,此方法无法翻译   进入商店表达。

所以我收集到这两种情况,它无法找出从UniqueIdentifiervarchar的T-SQL等价物。

除了检索对象之外,有没有办法解决这个问题,然后迭代我的返回集将每个对象复制到一个新对象并在那时转换guid->字符串?

感谢。

3 个答案:

答案 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 转换为字符串。