0

我使用EF5,但我確定它是一個更一般的EF問題。您可以在實體框架中使用Lambda表達式對ObjectSets嗎?

我無法得到以下的工作。我不斷收到鑄造錯誤:

Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[StdOrgUser]' to type 'System.Data.Objects.ObjectSet`1[StdOrgUser]'. 

的代碼:

public ObjectSet<StdOrgUser> StdOrgUser 
    { 
     get 
     { 
      if ((_StdOrgUser == null)) 
      { 
       _StdOrgUser = base.CreateObjectSet<StdOrgUser>("StdOrgUser"); 
       _StdOrgUser = (ObjectSet<StdOrgUser>) _StdOrgUser.Where(r => r.IsActive == false); 
      } 
      return _StdOrgUser; 
     } 
    } 

它編譯罰款。 Intellisense使我可以選擇LINQ運算符等。當我運行它時,我得到上面的運行時錯誤。

我哪裏錯了?

非常感謝您的幫助。

回答

1

ObjectSet類實現(除其他事項外)IQueryableIEnumerable,這兩種接口的具有擴展方法Where,見herehereIQueryableIEnumerable(它們是擴展方法的各自返回類型)都不能被轉換回ObjectSet

下面的代碼行無法評估,直到運行時間:

_StdOrgUser = (ObjectSet<StdOrgUser>) _StdOrgUser.Where(r => r.IsActive == false); 

,但如果去掉投代碼不能編譯:

_StdOrgUser = _StdOrgUser.Where(r => r.IsActive == false); 

UPDATE

對於查詢,您可以將StdOrgUsers的返回類型從ObjectSet更改爲IQueryable但您失去了所有其他方法,如AddAttach等。您無法使用此技術應用標準過濾器。你可以有一個擴展方法稱爲ActiveUsers()

public static IQueryable<StdOrgUser> ActiveUsers(this ObjectSet<StdOrgUser> users) 
{ 
    return users.Where(r => r.IsActive == false); 
} 

你需要做的是記住每個查詢使用它(不是很漂亮,但它清楚地表明意圖)

var results = myContext 
    .StdOrgUser 
    .ActiveUsers() 
    .Where(//some filter); 
+0

感謝您的答覆。那麼你對改變代碼的建議是什麼? – SamJolly

+0

謝謝你。我有點困惑,我是否可以在我的EF上下文文件中使用這種方法,這是上述代碼的來源。我確實想更改應用程序代碼。例如,我只想將當前的LINQ調用到StdOrgUser,現在只檢索StdOrgUser表中的非歸檔記錄。 – SamJolly

+0

這就是:public partial class myEntities:ObjectContext {etc .... public ObjectSet T – SamJolly

相關問題