为什么Linq-to-Entities在查询中识别查询,而不是在从方法返回查询时?

时间:2013-10-31 14:52:11

标签: c# entity-framework asp.net-mvc-4 linq-to-sql linq-to-entities

这是我发现的常见错误,但我不确定如何修复它。

LINQ to Entities does not recognize the method
'System.Linq.IQueryable`1[ProjectX.Models.DTOs.ExampleDTOUDC] Select(Int32)'
 method, and this method cannot be translated into a store expression.

以下是有问题的违规代码。

    public IQueryable<ExampleDTO> Select()
    {
        return from e in db.vw_Example
                   select new ExampleDTO()
                   {

                       exampleUDCs =  new ExampleUDCRepository().Select(v.VehicleID).AsEnumerable()
                       //etc


                   };
    }

和ExampleUDCRepository.Select()方法是:

  public IQueryable<ExampleUDCDTO> Select(int id)
  {
        return from eudc in db.ExampleUDCs
               where eudc.ExampleID == id
               select new ExampleUDCDTO()
               {
                   ExampleID = eudc.ExampleID,
                   //etc
               };
   }

我理解为什么Linq需要将所有内容都放在一个可以转换为SQL查询的形式中,但是我不明白为什么这样可行我从第一个Select()方法中获取相同的查询并且类似的东西:

        public IQueryable<ExampleDTO> Select()
    {
        return from e in db.vw_Example
                   select new ExampleDTO()
                   {    
                       ExampleID = e.ExampleID,
                       ExampleUDCs =  (from eudc in db.ExampleUDCs
                                      where eudc.ExampleID == id
                                      select new ExampleUDCDTO()
                                      {
                                           ExampleID = eudc.ExampleID
                                           //etc
                                      })


                   };
    }

如果你想看到它,这是我的ExampleDTO类中的ExampleUDCs声明:

public IEnumerable<ExampleUDCDTO> ExampleUDCs { get; set; }

是否有人知道我可以通过ExampleUDCDTO().Select(int id)方法重复使用代码而不是将所有查询放入第一个Select()方法中来解决此问题?

如果您需要更多信息,请与我们联系。谢谢。

1 个答案:

答案 0 :(得分:1)

实体框架与表达式一起使用,它尝试将完整表达式编译成一段SQL。由于您正在创建一个带有方法调用的表达式,因此EF也尝试将该方法调用编译为SQL。这是不可能的。