2013-05-20 162 views
1

現在,我試圖正確加入一個例外彈出。不能隱式地將類型'System.Collections.Generic.List <AnonymousType#1>'轉換爲'System.Collections.Generic.IEnumerable

這是我的控制器

public IEnumerable<APPLICANT> GetApplicant() 
    { 
     IEnumerable<APPLICANT> applicantdata = Cache.Get("applicants") as IEnumerable<APPLICANT>; 
     IEnumerable<Profile> profiledata = Cache.Get("profiles") as IEnumerable<Profile>; 


     if (applicantdata == null) 
     { 

      var applicantList = (from a in context.Profiles 
           join app in context.APPLICANTs 
           on a.PROFILE_ID equals app.Profile_id into joined 
           from j in joined.DefaultIfEmpty() 
           select new 
              { 
               APPLICANT = j, 
               Profile = a, 
              }).Take(1000).AsEnumerable(); 

        applicantdata = applicantList.AsEnumerable().ToList(); 


      if (applicantdata.Any()) 
      { 
       Cache.Set("applicants", applicantdata, 30); 
      } 
     } 
     return applicantdata; 

    } 

這是

applicantdata = applicantList.AsEnumerable().ToList(); 

無法隱式轉換類型錯誤 'System.Collections.Generic.List < AnonymousType#1 >' 到 「 System.Collections.Generic.IEnumerable <Applicant.Models.APPLICANT>'。顯式 轉換不存在(是否缺少強制轉換?)

+0

如何定義'APPLICANT'? –

+0

[不能隱式地將類型'List '轉換爲'IEnumerable ']的重複(http://stackoverflow.com/questions/16602765/cannot-implicitly-convert-type-listanonymoustype1- to-ienumerablemodels-ap) –

+0

如果您使用'IEnumerable '作爲返回類型,那麼爲什麼要在LINQ中創建一個匿名類型? 您需要使用'select new Applicant {}' – Nilesh

回答

1

applicantdataIEnumerable<APPLICANT>,在你的SELECT語句中使用的是new關鍵字選擇anonymous type object,這就是爲什麼你不能將其轉換爲IEnumerable<APPLICANT>

您必須在select語句中使用屬性創建臨時類,並返回該類的IEnumerable

像:

public class MyClass 
{ 
    public APPLICANT applicant {get;set;} 
    public Profile porfile {get;set;} 
} 

然後修改函數返回IEnumerable<MyClass>

public IEnumerable<MyClass> GetApplicant() 
{ 
    IEnumerable<MyClass> applicantdata = Cache.Get("applicants") as IEnumerable<MyClass>; 
    IEnumerable<Profile> profiledata = Cache.Get("profiles") as IEnumerable<Profile>; 

    IEnumerable<MyClass> applicantList; 
    if (applicantdata == null) 
    { 

     applicantList = (from a in context.Profiles 
          join app in context.APPLICANTs 
          on a.PROFILE_ID equals app.Profile_id into joined 
          from j in joined.DefaultIfEmpty() 
          select new MyClass //Change here 
             { 
              APPLICANT = j, 
              Profile = a, 
             }).Take(1000); 

       applicantdata = applicantList.AsEnumerable(); 



     if (applicantdata != null && applicantdata.Any()) 
     { 
      Cache.Set("applicants", applicantdata, 30); 
     } 
    } 
    return applicantdata; 

} 

無法投射到APPLICANT,因爲這似乎是通過實體框架生成的類。

+0

您需要將applicantdata更改爲MyClass類型,然後將賦值放回。代碼的全部內容是避免查詢是否已經存在於緩存中! –

+0

我認爲先生這是行不通的,因爲applicantdata是我的容器 –

+0

@BobVale,是的。感謝您指出這一點,我更關注錯誤,然後是一般方法,但再次感謝 – Habib

0

您正在定義申請人的數據是一個IEnumerable<APPLICANT>但是申請人名單的返回類型爲IEnumerable<{Anonymous Type}>

你需要一些功能,如果你想以這種方式來使用它從你的匿名值轉換爲申請人。

0

你可以設置你的返回類型

IQueryable 

然後返回

applicantList.AsEnumerable().ToList().AsIQueryable(); 

public IEnumerable<APPLICANT> GetApplicant() 
{ 
    applicantdata = applicantList.AsEnumerable().ToList().AsQueryable(); 

} 

將解決你的問題。

0

我認爲這不是一種有效的實現方式,因爲當你調用.ToList時,它執行查詢並將數據抓取到內存中,然後再次轉換爲.AsQueryable()。想象一下,如果你有一千條記錄,並且花費多少。 如果我錯了,請糾正我。乾杯

0

而不是返回IEnumerable而是返回IEnumerable,然後當你做查詢調用.ToLost()就可以了。

public IEnumerable GetApplicant() 
    { 
     IEnumerable<APPLICANT> applicantdata = Cache.Get("applicants") as IEnumerable<APPLICANT>; 
     IEnumerable<Profile> profiledata = Cache.Get("profiles") as IEnumerable<Profile>; 


     if (applicantdata == null) 
     { 

      var applicantList = (from a in context.Profiles 
           join app in context.APPLICANTs 
           on a.PROFILE_ID equals app.Profile_id into joined 
           from j in joined.DefaultIfEmpty() 
           select new 
              { 
               APPLICANT = j, 
               Profile = a, 
              }).Take(1000); //AsEnumerable(); 

        applicantdata = applicantList.ToList(); //applicantList.AsEnumerable(); 


      if (applicantdata.Any()) 
      { 
       Cache.Set("applicants", applicantdata, 30); 
      } 
     } 
     return applicantList.ToList(); //applicantdata; 

    } 
相關問題