为什么Guid.ToString在Linq中返回大写字符串?

Mr *_*kle 12 .net c#

我遇到了一些奇怪/意外的行为,其中Guid.ToString()Linq表达式返回的结果与Guid.ToString()foreach循环中的结果不同.

方法是做什么的:

有问题的方法是简单地获取一个对象,然后从原始对象创建一个新的视图模型.我工作的公司已经决定不允许在视图模型上使用Guid,因为我们的一个较旧的JSON序列化程序有一个错误,其中Guid没有正确序列化.

问题/意外结果:

在调试/测试我的方法时,我发现我创建的Linq表达式返回了一个奇怪的结果.将我的Guid转换为其字符串表示形式时,结果会自动大写.我一开始并不认为这是Linq表达式,但是一旦我将逻辑转换为foreach循环,我得到了一个较低的字符串表示我的Guid.

示例代码:

请注意,lookupList(ID1,ID2,ID3)的属性类型都是Guid类型,NewClass上的属性都是string类型.

Linq表达:

List<NewClass> returnList = lookupList.Select(i => new NewClass {
                   Property1 = i.ID1.ToString(),
                   Property2 = i.ID2.ToString(),
                   Property3 = i.ID3.ToString(),
                   .....
                }).ToList();
Run Code Online (Sandbox Code Playgroud)

返回:

{
    Property1=7081C549-64D6-458E-A693-0D2C9C47D183
    Property2=06DD6A59-D339-4E15-89EA-48803DBA271E
    Property3=9A876EDD-3B79-C27E-1680-E0820A0CD6EC
}
Run Code Online (Sandbox Code Playgroud)

Foreach循环:

var returnList = new List<NewClass>();

foreach (var item in lookupList)
{
    returnList.Add(new NewClass
    {
        Property1 = item.ID1.ToString(),
        Property2 = item.ID2.ToString(),
        Property3 = item.ID3.ToString(),
        .....
    });
}
Run Code Online (Sandbox Code Playgroud)

返回:

{
    Property1=7081c549-64d6-458e-a693-0d2c9c47d183
    Property2=06dd6a59-d339-4e15-89ea-48803dba271e
    Property3=9a876edd-3b79-c27e-1680-e0820a0cd6ec
}
Run Code Online (Sandbox Code Playgroud)

问题:

为什么会发生这种情况并且是预期的行为?我希望Linq表达式和foreach循环在.ToString()应用于我的Guid 时返回相同的结果,但不知何故它不是.我还检查.ToString()过两个班级都没有覆盖.

先感谢您.

更新:

lookupList已被处理.ToList()它击中我的方法之前.LookupList是一个类型List<t>,其中t是一个自定义业务实体,它具有数据库没有的其他属性.道歉,我在原来的问题中没有说清楚.

Cyr*_*don 5

如果lookupList是IQueryable对象,那么您正在使用LINQ to SQL,而不是LINQ to object,那么这两个查询是不一样的.

lookupList.Select(i => new NewClass { Property1 = i.ID1.ToString(), etc..
Run Code Online (Sandbox Code Playgroud)

将执行SQL SELECT,结果将取决于您的DBMS.我的猜测是,ToString会转换成类似的东西CAST(Property1, varchar)

鉴于此查询:

foreach (var item in lookupList)
{
    returnList.Add(new NewClass { Property1 = item.ID1.ToString(), etc..
Run Code Online (Sandbox Code Playgroud)

将首先在您的数据库中执行select,然后在其上调用ToString.因此触发的方法是C#对象GUID的ToString方法.

试试这个例子:

List<NewClass> returnList = lookupList.ToList().Select(i => new NewClass {
               Property1 = i.ID1.ToString(),
               Property2 = i.ID2.ToString(),
               Property3 = i.ID3.ToString(),
               .....
            }).ToList();
Run Code Online (Sandbox Code Playgroud)

这应该返回小写属性.

.ToString通常不支持SQL,第一个查询应该是异常.但我猜你的团队中的某个人阅读了博客文章,解释了如何创建一个映射实体框架调用的SQL函数.

有趣的事实:示例函数创建大写的Guid字符串.

编辑:在纯LINQ to Object中,此代码返回小写字符串:

var lookupList = new[] { new Tuple<Guid, Guid>(Guid.NewGuid(), Guid.NewGuid()) };
var returnList = lookupList.Select(i => new
{
    Property1 = i.Item1.ToString(),
    Property2 = i.Item2.ToString(),
}).ToList();
Run Code Online (Sandbox Code Playgroud)

我们需要更多关于lookupList对象和那些属性的信息IDx.它们是纯C#Guid对象吗?

你已经说过了.要列出你的对象.如果你这样做是错误的,这将无法奏效:

坏的:

lookupList.ToList();
var returnList = lookupList.Select(i => new NewClass {
Run Code Online (Sandbox Code Playgroud)

好的:

var purePOCOList = lookupList.ToList();
var returnList = purePOCOList.Select(i => new NewClass {
Run Code Online (Sandbox Code Playgroud)