代码之家  ›  专栏  ›  技术社区  ›  Evonet

无法将lambda表达式转换为类型“object”

  •  0
  • Evonet  · 技术社区  · 2 年前

    如何让这个Lambda表达式在实体框架中工作?

    基本上,如果 goalCyleId ,然后查找并获得它的结束日期。

    .Select(x => new GoalDTO()
    {
        GoalId = x.GoalId,
        Name = x.Name,
        DueDate = x.GoalCycleId == null ? null : _context.GoalCycles.Find(y => y.GoalCycleId == x.GoalCycleId).EndDate
    })
    

    我出错了

    无法将lambda表达式转换为类型“object”,因为它不是委托类型

    0 回复  |  直到 2 年前
        1
  •  1
  •   Vivek Nuna Chetan sabhaya    2 年前

    Find DbSet类的方法需要一个主键值作为其参数,但您向它传递的是lambda表达式。使用 FirstOrDefault 相反 _context.GoalCycles.FirstOrDefault(y => y.GoalCycleId == x.GoalCycleId).EndDate

        2
  •  0
  •   Sachith Wickramaarachchi    2 年前

    请尝试使用以下查询,

    .Select(x => new GoalDTO() {
      GoalId = x.GoalId,
        Name = x.Name,
        DueDate = x.GoalCycleId == null ? null : _context.GoalCycles.FirstOrDefault(y => y.GoalCycleId == x.GoalCycleId).EndDate
    
    })
    
        3
  •  0
  •   Steve Py    2 年前

    如果您的实体是用导航属性设置的,那么您只需要以下内容:

    .Select(x => new GoalDTO()
    {
        GoalId = x.GoalId,
        Name = x.Name,
        DueDate = x.GoalCycle.EndDate
    })
    

    Goal上的GoalCycleId可能为Null,因此GoalCycle导航引用可能为#Null,但当EF向下投影时,如果该Goal没有GoalCycles,则会将DueDate#Null保留为空,否则将采用结束日期。然而,这会绊倒 NullReferenceException 如果 Select 是在EF查询具体化之后进行的。(即过早 ToList() )

    它不应该抱怨:

    DueDate = x.GoalCycle?.EndDate