繁体   English   中英

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

[英]Converting guid to string with entity framework

我试图通过 Web 服务将 GUID 作为字符串传递,但是我遇到了障碍。 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 Entities 无法识别方法“System.String ToString(System.Object)”方法,并且此方法无法转换为存储表达式。

所以我认为在这两种情况下,它都无法找出从UniqueIdentifiervarchar的 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 转换为字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM