asp.net - LINQ to Entities 无法识别方法 'Char get_

我是 ASP.NET MVC4 和实体框架的新手。


我在我的 API 中设置了一个新方法,它应该获取所有partners具有prestation在 GET 参数中找到的名称的方法prestation。


我收到标题中的错误,不知道如何解决:


LINQ to Entities 无法识别方法 'Char get_Chars(Int32)' 方法,并且该方法无法转换为存储表达式。


这是我的方法:


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

}

任何帮助,将不胜感激。


感谢任何愿意花时间阅读/回答这篇文章的人。


富国沪深
浏览 178回答 1
1回答

隔江千里

当您使用实体框架编写 LINQ 查询时,它会尝试将您的查询转换为 SQL 查询。某些 .NET 操作无法转换为 SQL。我相信违规行是:p.LastName.ToUpper()[0]我也希望您对 rnd.Next() 的调用也会导致错误。这是我将如何处理这种情况:在没有违规列的情况下执行查询。用 .ToList() 结束您的查询。这会将结果集加载到内存中。循环遍历结果集并添加缺失的列。由于您的结果集已加载到内存中,因此不会在 .NET 操作中引发错误。&nbsp; &nbsp; var result = db.Partenaires&nbsp; &nbsp; &nbsp; &nbsp; .Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))&nbsp; &nbsp; &nbsp; &nbsp; .Select(p => new PartenaireMapItem {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IdPartenaire = p.IdPartenaire,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FirstName = p.FirstName,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LastName = p.LastName,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Type = p.Type,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Lat = p.Lat,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Lng = p.Lng,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImageUrl = p.ImageUrl,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SeDeplace = p.SeDeplace,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ADomicile = p.ADomicile,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Prestations = new List(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))&nbsp; &nbsp; &nbsp; &nbsp; }).ToList();&nbsp; &nbsp; foreach (var row in result) {&nbsp; &nbsp; &nbsp; &nbsp; row.NomComplet = row.LastName.ToUpper()[0] + ". " + row.FirstName;&nbsp; &nbsp; &nbsp; &nbsp; row.DureeMin = rnd.Next(2, 50);&nbsp; &nbsp; &nbsp; &nbsp; row.NoteGlobale = rnd.Next(1, 6);&nbsp; &nbsp; }&nbsp; &nbsp; return result;第二种方法是在 SQL Server 中创建存储过程。这将消除拆分查询的需要。这是最有效的方法,但也需要做更多的工作,并且会为您的应用程序添加更多层。如果您预计会有大量流量和数据,我只会推荐此选项。注意:第三种方法是在 db.Partenaires 之后立即使用 .AsEnumerable() 或 .ToList() 来避免错误。例如:db.Partenaires.AsEnumerable().Where……或者db.Partenaires.ToList().Where……但是,这种方法的危险在于它将整个表加载到内存中。换句话说,SQL 查询将等效于select * from Partenaires. 然后实体框架将不得不执行额外的查询来检索相关表(如 PartenairePrestations)中的数据,并且它将在内存中执行所有其他过滤和操作。这是效率最低的选项。尽管这种方法会在短期内奏效,但随着数据的增长,它会开始成为性能问题,因此我不推荐它。
打开App,查看更多内容
随时随地看视频慕课网APP