【发布时间】:2011-01-07 20:46:41
【问题描述】:
我正在尝试使用 AutoMapper 和存储库模式以及流畅的界面,但在使用 Linq 投影时遇到了困难。值得一提的是,仅使用内存中的对象时,此代码就可以正常工作。但是,当使用数据库提供程序时,它会在构建查询图时中断。我已经尝试过 SubSonic 和 Linq to SQL,结果相同。感谢您的想法。
这是一个在所有场景中都使用的扩展方法 - 这是问题的根源,因为不使用扩展方法一切正常
public static IQueryable<MyUser> ByName(this IQueryable<MyUser> users, string firstName)
{
return from u in users
where u.FirstName == firstName
select u;
}
这是运行良好的内存代码
var userlist = new List<User> {new User{FirstName = "Test", LastName = "User"}};
Mapper.CreateMap<User, MyUser>();
var result = (from u in userlist
select Mapper.Map<User, MyUser>(u))
.AsQueryable()
.ByName("Test");
foreach (var x in result)
{
Console.WriteLine(x.FirstName);
}
这是使用失败的 SubSonic(或 Linq to SQL 或其他)的同一件事。这就是我想通过扩展方法以某种方式实现的功能......
Mapper.CreateMap<User, MyUser>();
var result = from u in new DataClasses1DataContext().Users
select Mapper.Map<User, MyUser>(u);
var final = result.ByName("Test");
foreach(var x in final) // Fails here when the query graph built.
{
Console.WriteLine(x.FirstName);
}
这里的目标是避免必须手动将生成的“用户”对象映射到“我的用户”域对象——换句话说,我正在尝试找到一种使用 AutoMapper 的方法,所以我没有这种在需要数据库读取操作的任何地方映射代码:
var result = from u in new DataClasses1DataContext().Users
select new MyUser // Can this be avoided with AutoMapper AND extension methods?
{
FirstName = v.FirstName,
LastName = v.LastName
};
【问题讨论】:
标签: linq extension-methods linq-to-objects