Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net-LINQ to Entities无法识别方法“Char get_Chars(Int32)”方法,并且无法将此方法转换为存储表达式_C#_Asp.net_Entity Framework_Linq_Asp.net Mvc 4 - Fatal编程技术网

C# asp.net-LINQ to Entities无法识别方法“Char get_Chars(Int32)”方法,并且无法将此方法转换为存储表达式

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

我不熟悉ASP.NET MVC4和实体框架

我在我的API中设置了一个新方法,该方法应该可以获取所有具有在get参数prestation中找到的名称的prestation的合作伙伴

我收到标题中的错误,不知道如何修复它:

LINQ to Entities无法识别方法“Char get_CharsInt32”方法,并且无法将此方法转换为存储表达式

以下是我的方法:

// 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;