2010-08-27 111 views
1

有沒有更好的方法來做到這一點?Linq-To-SQL .ToList()運算符

我有一個LINQ到SQL查詢,我需要返回的抽象接口(如IList的<IUSER>),而不是具體的對象(例如列表<用戶>)定義的對象。

//從數據上下文

 List<User> users; 

     using (AbleridgeDataContext context = new AbleridgeDataContext()) 
     { 

      users = (from u in context.Users select u).ToList(); 
     } 

     // reassign concrete users to abstract interfaces 

     IList<IUser> genericUsers = new List<IUser>(); 

     foreach (var user in users) 
     { 
      IUser genericUser = user; 
      genericUsers.Add(genericUser); 
     } 

     return genericUsers; 

回答

2
return context.Users.Cast<IUser>().ToList(); 

或者用戶:

List<IUser> users = new List<IUser>(context.Users); 
0

試試這個。它會返回IEnumerable<IUser>

using (AbleridgeDataContext context = new AbleridgeDataContext()) 
{ 
    return context.Users.Select((IUser)u); 
} 

如果你真的想要的IList那麼你的函數的返回類型設置爲IList<IUser>並添加.ToList()到return語句的結束。

或者

return context.Users.OfType<IUser>(); 
1

你可以轉換爲IUSER查詢的突出部分:

List<User> users; 
    using (AbleridgeDataContext context = new AbleridgeDataContext()) 
    { 
     return from u in context.Users select (IUser)u; 
    } 

的一個變化,這需要是使你的函數返回IEnumerable<IUser>這將是更好的呢因爲在調用者開始枚舉之前查詢不會被執行。

雖然你也可以只使用ToList仍然如果你不想改變這一點。

更新 事實上,你可能會想,因爲using語句只要函數返回所以懶惰查詢會失敗處置您的數據上下文的使用ToList這裏。

0

將用戶聲明爲IList,並將用戶轉換爲帶有linq的IUser。

ToList返回一個IEnumerable,這是實現我IListList,所以它其實並不重要,哪一個聲明users作爲。

IList<IUser> users; 
    using (AbleridgeDataContext context = new AbleridgeDataContext()) 
    { 
     users = (from u in context.Users select u).Cast<IUser>().ToList(); 
    } 
0

MSDN website

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) 

你試過context.Users.ToList<IUser>()

關於上下文,ToList方法將強制對查詢進行評估,以便在處理上下文後結果可用。