Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

456
Views
¿Por qué Guid.ToString devuelve una cadena en mayúscula en Linq?

He encontrado un comportamiento extraño/inesperado en el que Guid.ToString() en una expresión de Linq devuelve un resultado diferente al de Guid.ToString() en un bucle foreach.

Qué está haciendo el método :

El método en cuestión simplemente toma un objeto y luego crea un nuevo modelo de vista a partir del objeto original. La empresa para la que trabajo ha decidido que Guid no se permitirá en los modelos de vista, debido a que uno de nuestros serializadores JSON más antiguos tiene un error en el que Guid no se serializó correctamente.

El problema/resultado inesperado :

Mientras depuraba/probaba mi método, descubrí que la expresión de Linq que creé devolvía un resultado extraño. Al convertir mi Guid a su representación de cadena, el resultado se capitalizó automáticamente. Al principio no creía que fuera la expresión de Linq, pero una vez que convertí la lógica en un bucle foreach, obtuve una representación de cadena en minúsculas de mi Guid.

Código de ejemplo :

Tenga en cuenta que los tipos de propiedad para lookupList (ID1, ID2, ID3) son todos de tipo Guid y las propiedades de NewClass son todas de tipo cadena.

Expresión Linq:

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

Devoluciones:

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

Bucle 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(), ..... }); }

Devoluciones:

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

La pregunta :

¿Por qué sucede esto y es este comportamiento esperado? Esperaría que tanto la expresión Linq como el bucle foreach devuelvan el mismo resultado cuando se aplica .ToString() a mi Guid, pero de alguna manera no es así. También verifiqué que no haya anulaciones de .ToString() en ninguna de las clases.

Gracias de antemano.

Actualizar:

La lista de lookupList ha sido manejada por un .ToList() antes de que llegue a mi método. LookupList es de tipo List<t> donde t es una entidad comercial personalizada que tiene propiedades adicionales que la base de datos no tiene. Disculpas, no aclaré esto en mi pregunta original.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Si lookupList es un objeto IQueryable, por lo que está usando LINQ to SQL y no LINQ to object , entonces las dos consultas no son iguales.

 lookupList.Select(i => new NewClass { Property1 = i.ID1.ToString(), etc..

Realizará un SQL SELECT, el resultado dependerá de su DBMS. Supongo que ToString se traducirá a algo como CAST(Property1, varchar)

Mientras que esta consulta:

 foreach (var item in lookupList) { returnList.Add(new NewClass { Property1 = item.ID1.ToString(), etc..

primero hará una selección en su base de datos y luego llamará a ToString en ella. Entonces, el método desencadenado es el método ToString del GUID del objeto C#.

Prueba esto por ejemplo:

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

Esto debería devolver Propiedades en minúsculas.

El .ToString normalmente no es compatible con SQL, y la primera consulta debería ser una excepción. Pero supongo que alguien en su equipo leyó esa publicación de blog que explica cómo puede crear una función SQL que asignará una llamada a Entity Framework .

Dato interesante: la función de ejemplo crea cadenas Guid en mayúsculas.

EDITAR: en LINQ to Object puro, este código devuelve cadenas en minúsculas:

 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();

Necesitamos más información sobre el objeto lookupList y esas propiedades IDx . ¿Son objetos Guid de C# puros?

Dijiste que ya .ToListed tu objeto. Eso no funcionará si lo estás haciendo de manera incorrecta:

MALO :

 lookupList.ToList(); var returnList = lookupList.Select(i => new NewClass {

BUENO :

 var purePOCOList = lookupList.ToList(); var returnList = purePOCOList.Select(i => new NewClass {
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!