强制LINQ to Entities识别我的方法

时间:2014-09-10 07:47:21

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

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

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可以识别我的方法?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

让DTO进行转换:

class CarDto
{
    ... 

    public int StatusId { get; set; }

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

因此,在查询中,您只需复制TypeId中的Car值即可。在应用程序中,您可以访问CarStatus

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