2011-03-26 94 views
3

我需要用ValueInjecter将IQueryable<User>映射到IQueryable<SimpleUser>IQueryable的ValueInjecter <T>

这可能吗?

我想:

return userRepo.GetUsers() 
       .Select(o => new SimpleUser().InjectFrom(o)) 
       .Cast<SimpleUser>(); 

但是,这不能被转换为存储表达式...好,方法InjectFrom

automapper可以做到这一点吗?

我想类似这样的东西:

return from i in userRepo.GetUsers() 
     select new SimpleUser{ 
      i.UserId, 
      i.Name 
     }; 

但利用某种映射工具。

回答

4

在进行选择之前将集合转换为对象,它应该可以工作。 更新使用PredicateBuilder来显示过滤和分页和Dynamic LINQ进行排序。

var predicate = new PredicateBuilder<User>.True(); 
if (!string.IsNullOrEmpty(typeFilter)) 
{ 
    predicate = predicate.And(u => u.Type == typeFilter); 
} 
if (!string.IsNullOrEmpty(nameFilter)) 
{ 
    predicate = predicate.And(u => u.Name.StartsWith(nameFilter)); 
} 

// assumes sortColumn matches one of your user properties and 
// sortDirection is either "ASC" or "DESC" 
string sortOrder = string.Format("{0} {1}", sortColumn, sortDirection); 

return userRepo.GetUsers() 
       .Where(predicate) 
       .OrderBy(sortOrder) 
       .Skip((page-1) * usersPerPage) 
       .Take(usersPerPage) 
       .ToList() // force the query and make these objects 
       .Select(o => new SimpleUser().InjectFrom(o)) 
       .Cast<SimpleUser>(); 
+0

有没有办法在评估查询之前做到这一点?我有一个网格控件,利用IQueryable进行过滤,分页和排序。 – 2011-03-26 17:03:57

+0

@Lol编码器 - 在尝试进行转换之前,您需要进行过滤,排序和分页。简单而简单,转换不会转换为SQL,因此您必须将LINQ用于对象,这意味着所有对象都必须位于内存中。是否可以映射对应于SimpleUser的视图?然后你可以设置SQL函数对应的视图,允许你传入参数做过滤,排序,分页。 – tvanfosson 2011-03-26 17:07:50

+0

@tvanfosson我编辑了我的问题以显示我想实现的目标。 – 2011-03-26 19:45:43