【问题标题】:LINQ where clause running against mapped object针对映射对象运行的 LINQ where 子句
【发布时间】:2023-03-07 01:51:01
【问题描述】:

如果我想运行这样的东西

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 子句运行对抗 DAL 而不是 BLL...

这一定是可能的!任何想法将不胜感激。

【问题讨论】:

    标签: c# .net linq reflection iqueryable


    【解决方案1】:

    这可能有点离谱,但我就是这样做的。在我的 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));
    

    可能有点混乱,如果我离题太远,请告诉我,或者您需要更多解释。

    【讨论】:

    • 您好,目前的计划无法实现这两者的接口!这是将两个对象 linq where 子句映射在一起,是你的吗?
    • 我的解决方案是在 DAL 上使用 where 子句,然后将 DAL 对象映射到业务对象。你是说你想做BLL.Person.Where(x =&gt; x.Id == id) 并在 DAL 对象中而不是 BLL 对象中查找?
    • 是的,这就是我想要做的......我本来打算回答是,但它让我输入了更多字符!
    【解决方案2】:

    您对 where 子句 (Expression&lt;Func&lt;BLL.Resource, bool&gt;&gt; where) 的签名是通往答案的重要一步。添加Expression&lt;...&gt; 告诉C# 编译器创建表达式树而不是where 参数的委托。解决方案是遍历表达式树并将所有对BLL.Person 的引用替换为对DAL.Person 的引用。正如您所说,由于它们是相同的,因此您应该能够针对 DAL 编译和运行修改后的表达式树而不会出现任何问题。

    【讨论】:

    • 嗨,感谢您的回复,我开始对此失去所有希望。我会研究表达式树并回复你,如果你有任何参考资料或例子,我将不胜感激。
    • @Shahin - 尝试查看System.Core 中的System.Linq.Expressions.ExpressionVisitor 类。它是用于重写表达式的抽象类。使用 Reflector.NET,我可以找到三个派生的实现,希望能让您了解如何使用它。您需要使用 Reflector 转储源,因为它是内部的。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2020-07-10
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多