使用Entity Framework将GUID转换为字符串

4

我正在尝试将GUID作为字符串通过Web服务传递,但是我遇到了一些问题。GUID存储在SQL Server中作为UNIQUEIDENTIFIER,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 Entities 不认识方法 'System.String ToString(System.Object)',而且此方法无法转换为存储表达式。

因此,我认为在这两种情况下,它都不能找到从 UniqueIdentifiervarchar 的 T-SQL 等效方法。

除了检索对象,然后迭代返回集合并在该点将 guid->string 转换的方式之外,还有其他方法吗?

谢谢。


这是一个解决方法。让你的 bar 类型拥有一个返回其 Guid 的字符串属性,然后在你的 Linq 查询中使用这个属性。 - Beatles1692
执行 lambda 语句后,query 的值是多少? - MethodMan
3个回答

7
在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()代替它。)

谢谢,我会使用你提供的第二个查询,直到我有机会进行性能测试。否则,我可能不得不像Zruty提到的那样切换到存储过程之类的东西。 - Dio

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
现在可以使用new Guid(<your string>);将字符串转换为Guid,而不是将Guid转换为字符串。

1
这个回答如何解决问题? - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接