2010-08-27 110 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方法将强制对查询进行评估,以便在处理上下文后结果可用。