¿Por qué LINQ to Entities no reconoce el método ‘System.String ToString ()?

Obteniendo error dentro de la aplicación web MVC3. LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

cuando bash buscar valores usando EF de la consulta:

 public class DataRepository { public mydataEntities1 dbContext = new mydataEntities1(); public List GetPricingSecurityID() { var pricingSecurityID = (from m in dbContext.Reporting_DailyNAV_Pricing select new SelectListItem { Text = m.PricingSecurityID.ToString(), Value = m.PricingSecurityID.ToString() }); return pricingSecurityID.ToList(); } } 

Eso no se puede convertir a SQL. Supongo que, en teoría, podría, pero no se implementa.

Solo necesita realizar su proyección después de obtener sus resultados:

 var pricingSecurityID = (from m in dbContext.Reporting_DailyNAV_Pricing select m.PricingSecurityID).AsEnumerable() .Select(x => new SelectListItem{ Text = x.ToString(), Value = x.ToString() }); 

Si ya es una cadena, ¿por qué te molestas en llamar a ToString en primer lugar? Sospecho que una traducción no se incluyó en LINQ to Entities porque no tiene sentido. Cambie su cláusula de selección a:

 select new SelectListItem { Text = m.PricingSecurityID, Value = m.PricingSecurityID } 

Si realmente necesita hacer algo que LINQ no admite Entidades, use AsEnumerable para pasar de una consulta de base de datos a un proceso:

 public List GetPricingSecurityID() { return dbContext.Reporting_DailyNAV_Pricing .Select(m => m.PricingSecurityID) .AsEnumerable() // Rest of query is local // Add calls to ToString() if you really need them... .Select(id => new SelectListItem { Text = id, Value = id }) .ToList(); } 

Estoy de acuerdo con las objeciones de Jason también, por cierto. Sería mejor devolver una List que se representa en otro lugar.

También tenga en cuenta que si solo va a usar una única cláusula de select o solo una cláusula where , las expresiones de consulta realmente no agregan mucho: llamar a los métodos de extensión LINQ puede terminar con menos desorden, particularmente si desea llamar a métodos que no son compatibles con expresiones de consulta (como ToList ).

Porque está intentando convertirlo a SQL, y no puede. ToString la llamada a ToString y haz una proyección antes de regresar a la persona que llama. Por lo tanto, reemplace su cláusula de select con

 select m.PricingSecurityID 

y luego decir

 return pricingSecurityID .AsEnumerable() .Select(x => x.ToString()) .Select(x => new SelectListItem { Text = x, Value = x }) .ToList(); 

Además, observo que estás mezclando preocupaciones de UI y preocupaciones de consulta de datos. Esto es generalmente una mala práctica. En realidad, solo deberías devolver la lista de ID y dejar que la parte de la interfaz de usuario de tu código se preocupe por manipularla correctamente.

Qué tal esto. En este ejemplo, tanto el campo VDN en el db como el campo Skill son enteros. Estoy buscando coincidencias de ambos campos, así que tengo 2 comparaciones.

Incluye esto:

 using System.Data.Objects.SqlClient; // needed to convert numbers to strings for linq 

Al comparar números haz esto:

  // Search Code if (!String.IsNullOrEmpty(searchString)) { depts = depts.Where(d => SqlFunctions.StringConvert((double)d.VDN).Contains(searchString.ToUpper()) || SqlFunctions.StringConvert((double)d.Skill).Contains(searchString.ToUpper())); } // End Search Code 

Workie.

Lamentablemente EF no sabe cómo convertir .ToString () Debe usar la función incrustada SqlFunctions.StringConvert: http://msdn.microsoft.com/en-us/library/dd466292.aspx Además, no hay sobrecarga para int, por lo que debe typecast para duplicar 🙁

 var vendors = from v in Vendors select new { Code = SqlFunctions.StringConvert((double)v.VendorId) }; 

Entiendo que esta pregunta está respondida y acepto que usar AsEnumerable() es el camino a seguir. Sin embargo, me gustaría destacar un escenario común que generalmente encuentro donde AsEnumerable() se usa de manera ineficiente para resolver este error.

De .NET Language-Integrated Query para datos relacionales

El operador AsEnumerable (), a diferencia de ToList () y ToArray (), no causa la ejecución de la consulta. Todavía es diferido. El operador AsEnumerable () simplemente cambia el tipado estático de la consulta, convirtiendo un IQueryable en un IEnumerable, engañando al comstackdor para que trate el rest de la consulta como ejecutada localmente.

Referencias

  1. ¿Estoy entendiendo mal LINQ to SQL .AsEnumerable ()?
  2. Comprender .AsEnumerable () en LINQ to SQL

Manera ineficiente

 IEnumerable inefficientEnumerable = (from a in db.Invoices where a.Practice_Key == practiceKey.FirstOrDefault() select a ).AsEnumerable(). Select(x => new InvoiceDTO { InvoiceID = x.InvoiceID, PracticeShortName = x.Dim_Practice.Short_Name, InvoiceDate = x.InvoiceDate, InvoiceTotal = x.InvoiceAmount, IsApproved = x.IsApproved, InvoiceStatus = ( x.IsApproved == null ? "Pending" : x.IsApproved == true ? "Approved" : x.IsApproved == false ? "Rejected" : "Unknown" ), InvoicePeriodStartDateText = x.InvoicePeriodStart.ToShortDateString(), InvoicePeriodEndDateText = x.InvoicePeriodEnd.ToShortDateString(), InvoicePeriodStartDate = x.InvoicePeriodStart, InvoicePeriodEndDate = x.InvoicePeriodEnd } ); invoices = inefficientEnumerable.ToList(); 

Aquí el AsEnumerable se usa para toda la tabla. Todas las columnas se seleccionan a pesar de que no son necesarias.

Mejor manera

  IQueryable invoicesQuery = (from a in db.Invoices where a.Practice_Key == practiceKey.FirstOrDefault() select new InvoiceDTO { InvoiceID = a.InvoiceID, PracticeShortName = a.Dim_Practice.Short_Name, InvoiceDate = a.InvoiceDate, InvoiceTotal = a.InvoiceAmount, IsApproved = a.IsApproved, InvoiceStatus = ( a.IsApproved == null ? "Pending" : a.IsApproved == true ? "Approved" : a.IsApproved == false ? "Rejected" :"Unknown" ), InvoicePeriodStartDate = a.InvoicePeriodStart, InvoicePeriodEndDate = a.InvoicePeriodEnd }); IEnumerable betterEnumerable = invoicesQuery.AsEnumerable(). Select(x => new InvoiceDTO { InvoiceID = x.InvoiceID, PracticeShortName = x.PracticeShortName, InvoiceDate = x.InvoiceDate, InvoiceTotal = x.InvoiceTotal, IsApproved = x.IsApproved, InvoiceStatus = x.InvoiceStatus, InvoicePeriodStartDateText = x.InvoicePeriodStartDate.ToShortDateString(), InvoicePeriodEndDateText = x.InvoicePeriodEndDate.ToShortDateString(), InvoicePeriodStartDate = x.InvoicePeriodStartDate, InvoicePeriodEndDate = x.InvoicePeriodEndDate } ); 
 return dbContext.Reporting_DailyNAV_Pricing.AsEnumerable().Select(x => new SelectListItem { Text = x.PricingSecurityID.ToString(), Value = x.PricingSecurityID.ToString() }).ToList();