针对映射对象运行 LINQ where 子句
如果我想
BLL.Person person = (BLL.Person)repository.Single(item => item.Id == Id);
在我的单一方法中运行类似 Down 的东西,我会这样做:
public Resource Single(Expression<Func<BLL.Resource, bool>> where)
{
Resource resource = AsQueryable().FirstOrDefault(where);
return resource;
}
protected IQueryable<BLL.Resource> AsQueryable()
{
// I need to use the where clause on an object called DAL.Resource
throw new NotImplementedException();
}
DAL.Resource 对象与 BLL.Resource 相同,但是 BLL 副本不知道持久性。我可以使用 automapper 映射事物返回我想要的集合没有问题,但是我需要 where 子句运行 DAL 而不是 BLL...
这一定是可能的!任何想法将不胜感激。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您对 where 子句的签名 (
Expression> where
) 是通往答案的非常好的一步。添加Expression<...>
告诉 C# 编译器为where
参数创建表达式树而不是委托。解决方案是遍历表达式树,并将对BLL.Person
的所有引用替换为对DAL.Person
的引用。正如您所说,既然它们是相同的,那么您应该能够针对 DAL 编译和运行修改后的表达式树,没有任何问题。Your signature for the where-clause (
Expression<Func<BLL.Resource, bool>> where
) is a very good step along the way to the answer. AddingExpression<...>
tells the C# compiler to create an expression tree rather than a delegate for thewhere
parameter. The solution is to traverse the expression tree and replace all references to yourBLL.Person
with references toDAL.Person
. Since they are identical, as you say, then you should be able to compile and run the modified expression tree against the DAL without any problems.这可能有点离谱,但我就是这样做的。在我的 BLL 对象中,我在构造函数中传递了一个 DAL 对象。在我的服务中,我获取 DAL 对象,创建一个新的 BLL 对象,并将 DAL 对象传入。然后 BLL 对象映射出 DAL 对象。
然后使用 LINQ 执行此操作:
可能有点令人困惑,如果我偏离基地,请告诉我,或者您需要更多解释。
This may be way off base, but this is how I do it. In my BLL objects, I pass a DAL object in in the constructor. In my services, I get the DAL object, and create a new BLL object, and pass the DAL object in. The BLL object then maps out the DAL object.
Then do this with LINQ:
Probably a little confusing, let me know if I am way off base, or you need more explanation.