代码之家  ›  专栏  ›  技术社区  ›  djdd87

如何在另一个表达式中创建表达式?

  •  4
  • djdd87  · 技术社区  · 14 年前

    如果已经问过了,请原谅我。我刚开始使用LINQ。我有以下表达:

    public static Expression<Func<TblCustomer, CustomerSummary>> SelectToSummary()
    {
        return m => (new CustomerSummary()
        {
            ID = m.ID,
            CustomerName = m.CustomerName,
            LastSalesContact = // This is a Person entity, no idea how to create it
        });
    }
    

    我想能够填充 LastSalesContact ,这是一个 Person 实体。

    我想填写的详细信息来自 m.LatestPerson ,那么我怎样才能从 后人 上次销售联系人 . 我希望映射可以重复使用,也就是说,我不想这样做:

    LastSalesContact = new Person()
    {
       // Etc
    }
    

    我可以使用静态表达式吗,例如:

    public static Expression<Func<TblUser, User>> SelectToUser()
    {
        return x => (new User()
        {
            // Populate
        });
     }
    

    更新:

    这就是我需要做的:

    return m => (new CustomerSummary()
    {
        ID = m.ID,
        CustomerName = m.CustomerName,
        LastSalesContact = new Person()
        {
           PersonId = m.LatestPerson.PersonId,
           PersonName = m.LatestPerson.PersonName,
           Company = new Company()
           {
               CompanyId = m.LatestPerson.Company.CompanyId,
               etc
           }
        }
    });
    

    但我会重新使用 Person() 创建大约10-15个不同的类,所以我不希望完全相同的代码重复x次。我可能也会想这样做 Company .

    3 回复  |  直到 14 年前
        1
  •  1
  •   Necros    14 年前

    你不能用一下吗 automapper 为了这个?

    public static Expression<Func<TblCustomer, CustomerSummary>> SelectToSummary()
    {
        return m => Mapper.Map<TblCustomer, CustommerSummary>(m);
    }
    

    你需要做一些引导,但是它是非常可重用的。

    更新:

    我可能没有得到什么东西,但是这个函数的目的是什么?如果只想将一个或一组tbl对象映射到其他对象,为什么要使用表达式?

    你可以有这样的东西:

    var customers = _customerRepository.GetAll(); // returns IEnumerable<TblCustomer>
    var summaries = Mapper.Map<IEnumerable<TblCustomer>, IEnumerable<CustomerSummary>>(customers);
    

    还是我错过了什么?

        2
  •  0
  •   Jon Skeet    14 年前

    我不 认为 您将能够使用lambda表达式来执行此操作…您需要使用 factory methods in Expression . 老实说,这不太可能令人愉快。

    对于如何构建表达式树,我最喜欢的方法是从一个简单的例子开始,将您想要做的事情写成一个lambda表达式,然后对其进行反编译。这应该向您展示表达式树是如何构建的-尽管C编译器比我们更容易使用与属性相关联的元数据(我们必须使用 Type.GetProperty )

    这总是假设我正确理解你…很可能我没有。

        3
  •  0
  •   ChaosPandion    14 年前

    这个怎么样?

    public static Person CreatePerson(TblPerson data)
    {
        // ...
    }
    
    public static Expression<Func<TblPerson, Person>>  CreatePersonExpression()
    {
        return d => CreatePerson(d);
    }
    
    
    return m => (new CustomerSummary()
    {
        ID = m.ID,
        CustomerName = m.CustomerName,
        LastSalesContact = CreatePerson(m.LatestPerson)
    });