【问题标题】:LINQ to Entities does not recognize the method 'Int32 IndexOf(Int32)'LINQ to Entities 无法识别方法“Int32 IndexOf(Int32)”
【发布时间】:2014-04-29 12:01:48
【问题描述】:

MVC5 / EF 6

在我看来

@Html.DropDownList("selectPlayer", (SelectList)ViewBag.Players, "Select Player", new { @class = "form-control" })

在我的控制器中:

if (Convert.ToInt32(mySession.Format) == 4)
{
    List<Int32> teamDrawPIDs = new List<Int32>();
    List<TeamDraw> teamDrawPlayers;
    teamDrawPlayers = entityDB.TeamDraws.Where(t => t.TID == TID).ToList();

    foreach (TeamDraw tPlayer in teamDrawPlayers)
    {
        teamDrawPIDs.Add(tPlayer.PID);
    }

    // only get players in TeamDraw
    ViewBag.Players = new SelectList(entityDB.Players.Where(t => (teamDrawPIDs.IndexOf(t.PID) != -1)).OrderBy(p => p.Last), "PID", "selectListName");
}
else
{
    ViewBag.Players = new SelectList(entityDB.Players.OrderBy(p => p.Last), "PID", "selectListName");
}

mySession.Format 不是 4 时,一切正常。但是,只要它是 4,并且我的 ViewBag.Players 仅由 teamDrawPIDs 中的 ID 创建,我就会收到此错误(在视图页面上,控制器很好):

“LINQ to Entities 无法识别方法 'Int32 IndexOf(Int32)'”

【问题讨论】:

    标签: c# .net asp.net-mvc linq entity-framework


    【解决方案1】:

    根据错误,使用IndexOf() 的表达式无法转换为Sql。您可以尝试一些更 Sql Friendly 的东西,例如:

    entityDB.Players.Where(t => teamDrawPIDs.Contains(t.PID))
                    .OrderBy(p => p.Last)
    

    您还可以使用一些 linq 来消除 for-each,例如一步到位:

    var teamDrawPIDs = teamDrawPlayers.Select(tp => tp.PID).ToList();
    

    【讨论】:

    • 谢谢!我仍然不完全理解其中的区别,但你的剪断解决了它。
    • 除非另有说明,否则实体框架将尝试重新解析.Where()中传递的表达式谓词/过滤器作为Sql语句。不幸的是,并不是你在谓词中传递的所有内容都可以被剖析,例如使用IndexOf 来查看某个字段是否存在。但是,通过.Contains 执行此操作将可解析为类似于SQL IN('x', 'y') 表达式的内容。
    【解决方案2】:

    实体框架不支持直接强制转换。因此,我个人建议的最佳做法是设置一个变量,其值是我们将使用过滤器的值,以防止此类问题。

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多