0

這是我發現的一個常見錯誤,但我不知道如何解決它。爲什麼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 
             }) 


        }; 
    } 

在你想看到它時,這裏是我所示例的ExampleUDCs聲明類:

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

有誰知道辦法爲我解決這個問題,從我的ExampleUDCDTO().Select(int id)方法重用代碼,而不是把所有的查詢到第一Select()方法?

如果您需要更多信息,請讓我知道。謝謝。

回答

1

實體框架使用表達式,它試圖將完整的表達式編譯成一段SQL。由於您正在創建一個帶有方法調用的表達式,因此EF會嘗試將該方法調用編譯爲SQL。這是不可能的。