C# asp.net-LINQ to Entities无法识别方法“Char get_Chars(Int32)”方法,并且无法将此方法转换为存储表达式
我不熟悉ASP.NET MVC4和实体框架 我在我的API中设置了一个新方法,该方法应该可以获取所有具有在get参数prestation中找到的名称的prestation的合作伙伴 我收到标题中的错误,不知道如何修复它: LINQ to Entities无法识别方法“Char get_CharsInt32”方法,并且无法将此方法转换为存储表达式 以下是我的方法:C# asp.net-LINQ to Entities无法识别方法“Char get_Chars(Int32)”方法,并且无法将此方法转换为存储表达式,c#,asp.net,entity-framework,linq,asp.net-mvc-4,C#,Asp.net,Entity Framework,Linq,Asp.net Mvc 4,我不熟悉ASP.NET MVC4和实体框架 我在我的API中设置了一个新方法,该方法应该可以获取所有具有在get参数prestation中找到的名称的prestation的合作伙伴 我收到标题中的错误,不知道如何修复它: LINQ to Entities无法识别方法“Char get_CharsInt32”方法,并且无法将此方法转换为存储表达式 以下是我的方法: // GET: api/Partenaires_prestations [Authorize] [Route("api/Partena
// GET: api/Partenaires_prestations
[Authorize]
[Route("api/Partenaires_prestations")]
public List<PartenaireMapItem> GetPartenairesWithPrestations()
{
Random rnd = new Random();
var queryString = Request.GetQueryNameValuePairs();
var prestation = queryString.FirstOrDefault();
return db.Partenaires
.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
.Select(p => new PartenaireMapItem
{
IdPartenaire = p.IdPartenaire,
FirstName = p.FirstName,
LastName = p.LastName,
NomComplet = p.LastName.ToUpper()[0] + ". " + p.FirstName,
Type = p.Type,
DureeMin = rnd.Next(2, 50),
Lat = p.Lat,
Lng = p.Lng,
ImageUrl = p.ImageUrl,
SeDeplace = p.SeDeplace,
ADomicile = p.ADomicile,
NoteGlobale = rnd.Next(1, 6),
Prestations = new List<string>(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))
}).ToList();
}
任何帮助都将不胜感激
感谢所有愿意花时间阅读/回答本文的人。当您使用实体框架编写LINQ查询时,它会尝试将您的查询转换为SQL查询。某些.NET操作无法转换为SQL。我认为冒犯的界线是:
p.LastName.ToUpper()[0]
我还希望您对rnd.Next的调用也会导致错误
以下是我将如何处理这种情况:
执行查询时不包含有问题的列。以.ToList结束您的查询。这将把结果集加载到内存中。
循环遍历结果集并添加缺少的列。由于结果集已加载到内存中,因此它不会在.NET操作中抛出错误。
第二种方法是在SQL Server中创建存储过程。这将消除拆分查询的需要。这是最有效的方法,但也需要更多的工作,并为应用程序添加更多的层。我只建议您在需要大量流量和数据的情况下使用此选项
注意:第三种方法是在db.Partenaires之后立即使用.AsEnumerable或.ToList来避免错误。例如:
db.Partenaires.可计算的。在哪里。。。或者db.Partenaires.ToList.在哪里
但是,这种方法的危险在于它会将整个表加载到内存中。换句话说,SQL查询相当于从Partenaires中选择*。然后,实体框架将必须执行额外的查询来检索相关表(如partenairepresentations)中的数据,并在内存中执行所有其他过滤和操作。这是效率最低的选择。尽管这种方法短期内有效,但随着数据的增长,它将开始成为一个性能问题,因此我不推荐使用。p.LastName.ToUpper[0]不能转换为正确的sql语句。这就是您看到此错误的原因?基于Chetan的注释,您可以尝试使用p.LastName.Substring0,1.toUpper来代替索引字符串。字符串索引器属性已命名,但您在C代码中从未看到该名称。这是Chetan Ranpariya指出的部分。@PierrickMartellière如果在取出代码中显示的唯一字符串索引时,关于get_Chars仍然出现错误,然后你没有显示相关的代码。@PierrickMartellière我怀疑你从来没有像暗示的那样实际更改过代码,可能是因为你忘记了重新构建你的项目,所以你仍然在使用旧代码,或者你没有注意到,尽管你仍然得到一个异常,但异常消息已经更改。但是,在按照指示更改代码之后,不可能获得特定的异常消息。它不能来自查询字符串参数。它可能来自您的方法调用的其他代码,但我看不出您在哪里调用任何其他可能导致此问题的代码。回答得很好!泰。
var result = db.Partenaires
.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
.Select(p => new PartenaireMapItem {
IdPartenaire = p.IdPartenaire,
FirstName = p.FirstName,
LastName = p.LastName,
Type = p.Type,
Lat = p.Lat,
Lng = p.Lng,
ImageUrl = p.ImageUrl,
SeDeplace = p.SeDeplace,
ADomicile = p.ADomicile,
Prestations = new List(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))
}).ToList();
foreach (var row in result) {
row.NomComplet = row.LastName.ToUpper()[0] + ". " + row.FirstName;
row.DureeMin = rnd.Next(2, 50);
row.NoteGlobale = rnd.Next(1, 6);
}
return result;