如果我想运行这样的东西
BLL.Person person = (BLL.Person)repository.Single(item => item.Id == Id);
在我的单一方法中,我会做这样的事情:
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子句来运行agaisnt DAL而不是BLL ...
这必须以某种方式!任何想法都将不胜感激。
答案 0 :(得分:0)
这可能偏离基础,但这就是我的方式。在我的BLL对象中,我在构造函数中传递了一个DAL对象。在我的服务中,我获取DAL对象,并创建一个新的BLL对象,并传入DAL对象。然后BLL对象将映射出DAL对象。
using PersonDto = DAL.IPerson;
namespace BLL
{
public class Person : IPerson
{
private readonly PersonDto _person;
public Person(PersonDto person)
{
_person = person;
}
public string Name
{
get { return _person.Name; }
}
}
}
然后使用LINQ:
执行此操作BLL.Person person = new Person(repository.Single(item => item.Id == Id));
可能有点混乱,如果我离开基地,或者你需要更多解释,请告诉我。
答案 1 :(得分:0)
你对where子句(Expression<Func<BLL.Resource, bool>> where
)的签名是一个非常好的步骤。添加Expression<...>
告诉C#编译器创建表达式树而不是where
参数的委托。解决方案是遍历表达式树并使用对BLL.Person
的引用替换对DAL.Person
的所有引用。正如你所说,它们是相同的,那么你应该能够针对DAL编译和运行修改后的表达式树而没有任何问题。