【问题标题】:Force LINQ to Entities recognize my method强制 LINQ to Entities 识别我的方法
【发布时间】:2014-09-10 07:47:21
【问题描述】:

我有这些代码(这只是示例代码)

public SomeService ()
{
    public Queryable<CarDto> GetDtos()
    {
       context.Cars.Select(c => new CarDto
       {
          CarDtoId = c.Id,
          Name = c.Name,
          Status = GetCarStatus(c)
       })
    }



    private CarStatusEnum GetCarStatus(Car car)
    {
       if(car.statusId == 2 || car.statusId == 3)
       {
          return 4;
       }
       return 5;
    }

}

此代码抛出异常(LINQ to Entities 无法识别 GetCarStatus 方法)。

我知道:

  • 为什么会抛出
  • 我可以做 ToList() 但我需要 Iqueryble
  • 我可以在不使用方法的情况下内联编写方法代码

但我想知道方法我该怎么做,LINQ to Entities 才能识别我的方法?

【问题讨论】:

  • 通过实现您自己的查询提供程序
  • 你试过简单的三元运算符吗?像这样:Status = (car.statusId == 2 || car.statusId == 3) ? 4 : 5
  • @IVAAAN123,我指出我可以在不使用方法的情况下内联编写方法代码
  • “我该怎么做,LINQ to Entities 才能识别我的方法?”:你不能...这是纯 C# 代码,无法自动将其转换为 SQL。

标签: c# .net entity-framework linq-to-entities iqueryable


【解决方案1】:

不确定 LINQ to Entities 是否能够将此类函数转换为 SQL 查询。对于这种情况,您可能需要使用 Expression

【讨论】:

  • 你能提供例子或一些教程吗,因为我可以找到它
【解决方案2】:

让 DTO 进行转换:

class CarDto
{
    ... 

    public int StatusId { get; set; }

    public CarStatusEnum CarStatus
    {
        get { return StatusId == 2 || StatusId == 3 
                       ? CarStatusEnum.Four
                       : CarStatusEnum.Five; }
    }
}

因此,在查询中,您只需从 Car 复制 TypeId 值。并在应用程序中访问CarStatus

请注意,您应该返回 CarStatusEnum 成员,而不是普通整数(即使它们与 CarStatusEnum 值匹配。这些可能将来会发生变化,这不会破坏您的代码,但会肯定会导致有趣的错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2012-04-03
    • 2021-11-06
    • 2012-05-03
    相关资源
    最近更新 更多