LINQ where子句针对映射对象运行

时间:2010-09-09 13:25:33

标签: c# .net linq reflection iqueryable

如果我想运行这样的东西

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 ...

这必须以某种方式!任何想法都将不胜感激。

2 个答案:

答案 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编译和运行修改后的表达式树而没有任何问题。