C# linq中不允许使用String.Format或toString

C# linq中不允许使用String.Format或toString,c#,asp.net-mvc,entity-framework,linq,selectlist,C#,Asp.net Mvc,Entity Framework,Linq,Selectlist,下面的代码不受欢迎,并引发以下错误 LINQ to Entities无法识别“System.String FormatSystem.String,System.Object”方法,并且无法将此方法转换为存储表达式 在我将运输方法的成本从十进制改为十进制之前,我可以做到这一点?到小数点。我把它改成十进制,它开始抛出一个错误,然后我把它改回来,现在它仍然不喜欢这样。这里做的不对。我只是想让文本成为一个航运方法名称与-和成本作为文本的串联 var ShippingMethods = db.Ship

下面的代码不受欢迎,并引发以下错误

LINQ to Entities无法识别“System.String FormatSystem.String,System.Object”方法,并且无法将此方法转换为存储表达式

在我将运输方法的成本从十进制改为十进制之前,我可以做到这一点?到小数点。我把它改成十进制,它开始抛出一个错误,然后我把它改回来,现在它仍然不喜欢这样。这里做的不对。我只是想让文本成为一个航运方法名称与-和成本作为文本的串联

  var ShippingMethods = db.ShippingMethods.Select(x => new SelectListItem()
                    {
                        Text = x.Name + " - " + String.Format("c", x.Cost),
                        Value = x.Cost.ToString()
                    }).ToList();
您必须使用,并且可以从中找到原因

您必须使用,并且可以从中找到原因


调用numerable、ToList或ToArray将dbset的内容拉入内存,在内存中可以对其执行任何类型的操作。关于转换为存储表达式的消息意味着linq提供程序无法将String.Format转换为SQL并在数据库级别运行它


在这种情况下,在dbset上调用AsEnumerable可能没问题,但如果不想将整个表拉入内存,则需要对其进行过滤,然后列出它,然后使用select对其进行转换。

调用numerable或ToList或ToArray将dbset的内容拉入内存,在内存中可以对其执行任何类型的操作。关于转换为存储表达式的消息意味着linq提供程序无法将String.Format转换为SQL并在数据库级别运行它

在这种情况下,在dbset上调用AsEnumerable可能没问题,但如果不想将整个表拉入内存,则需要对其进行过滤,然后列出它,如果你考虑了性能,那么你可以使用它,如下面所示。B'COS如果我们从DB中检索所有与PixPin方法表相关的行数据,然后在内存上做投影。AsNeavaby意味着它会严重地降低性能。下面的查询适合正在考虑的DEVS。EF查询的性能

可计算

将每条记录加载到应用程序内存中,然后执行筛选等操作,例如Where/Take/Skip。它将从MyTable中选择*并将其放入内存,然后选择第一个X元素“”

db.ShippingMethods.Select(x => new 
                    {
                        Name = x.Name,
                        Cost = x.Cost,
                    }).AsEnumerable().Select(y => new SelectListItem()
                    {
                        Text = y.Name + " - " + String.Format("c", y.Cost),
                        Value = y.Cost.ToString()
                    }).ToList();

如果您考虑性能,则可以使用如下所示。B'COS,如果我们从DB中检索所有与PixPosivices表相关的行数据,然后在内存上做投影。AsNeavaby意味着它会严重地降低性能。下面的查询适合正在考虑EF查询性能的DEVS。p> 可计算

将每条记录加载到应用程序内存中,然后执行筛选等操作,例如Where/Take/Skip。它将从MyTable中选择*并将其放入内存,然后选择第一个X元素“”

db.ShippingMethods.Select(x => new 
                    {
                        Name = x.Name,
                        Cost = x.Cost,
                    }).AsEnumerable().Select(y => new SelectListItem()
                    {
                        Text = y.Name + " - " + String.Format("c", y.Cost),
                        Value = y.Cost.ToString()
                    }).ToList();

你能补充一个理由吗?我是说为什么我们需要。可计算的?是的,这背后的原因是什么。如果要格式化properties.String.Format,在EF尝试运行查询以获取数据时,无法将其转换为有效的SQL表达式,我只是不明白该类型有什么问题。看见当您开始枚举结果时,它将获取原始数据,并且字符串操作可以在内存中完成。原始数据意味着它将检索ShippingMethods表的所有列吗?如果是,则是可怕的否,即性能方面@shyju您可以运行SQL探查器来查看执行该代码时发生了什么。如果只需要几列,可以先执行Select调用,然后再执行AsEnumerable调用。是否也可以添加原因?我是说为什么我们需要。可计算的?是的,这背后的原因是什么。如果要格式化properties.String.Format,在EF尝试运行查询以获取数据时,无法将其转换为有效的SQL表达式,我只是不明白该类型有什么问题。看见当您开始枚举结果时,它将获取原始数据,并且字符串操作可以在内存中完成。原始数据意味着它将检索ShippingMethods表的所有列吗?如果是,则是可怕的否,即性能方面@shyju您可以运行SQL探查器来查看执行该代码时发生了什么。如果只需要几列,可以先执行Select调用,然后执行AsEnumerable调用。此代码甚至不会编译!在第二个示例中,Select y表示没有Cost或Name属性的SelectListItem。更改属性名称,或者更好,在first Select中进行匿名投影。Selectx=>new{Name=x.Name,Cost=x.Cost}.AsEnumerableAha…非常感谢:我已经这样做了。希望现在一切正常不@Shyju这段代码甚至不会编译!在第二个示例中,Select y表示没有Cost或Name属性的SelectListItem。更改属性名称,或者更好,在第一个Selec中执行匿名投影
t.Selectx=>new{Name=x.Name,Cost=x.Cost}.AsEnumerableAha…非常感谢:我做了。希望现在一切都好了不@仙居