1

我可以MemberInitExpression从字面上返回无参数构造函数的函数创建无参数构造函数的表达式或任何表达式吗?

public IQueryable<GroupView> GetViewSelect(IQueryable<ItemGroup> myQ)
{
    return myQ.SelectMany(GetExpression1(), GetExpression2());
}        

internal static Expression<Func<ItemGroup, IEnumerable<ItemDetail>>> 
    GetExpression1()
{
    // m is the ItemGroup
    // m.item is Item
    // m.item.itemDetail is a collection of ItemDetail
    return m => m.item.itemDetail; 
}

internal static Expression<Func<ItemGroup, ItemDetail, GroupView>> 
    GetExpression2()
{
    // m is the ItemGroup
    // n is the ItemDetail
    // and it's error at runtime coz LINQ doesnt know the GetGroupView.. :(
    return (m, n) => GetGroupView(m, n);
}

internal static GroupView GetGroupView(ItemGroup m, ItemDetail n)
{
    // I think the same error will occurs
    // coz LINQ doesnt know the GetItemView and GetItemDetailView
    return new GroupView
    {
        Id = m.id,
        Name = m.name,
        ItemDetailsTotalCount = 
            m.item.ItemDetails.Sum(nn => nn.item.itemDetails.Count),

        Item = GetItemView(m.item),
        ItemDetail = GetItemDetailView(n)
    };
}    

internal static ItemView GetItemView(Item m)
{
    return new ItemView
    {
        Id = m.id,
        Name = m.name,
        DetailCount = m.ItemDetail.Count
    };
}

internal static ItemDetailView GetItemDetailView(ItemDetail n)
{
    return new ItemDetailView
    {
        Id = n.id,
        Name = n.name,            
        Supplier = GetSupplierView(n.supplier)
    };
}

internal static SupplierView GetSupplierView(Supplier n)
{
    return new SupplierView
    {
        Id = n.id,
        Name = n.name,
        Email = n.email ?? "no email",
        Phone = n.phone ?? "no phone"
    };
} 

当然,以上这些都不起作用,..但我只是想避免一遍又一遍地重新输入相同的无参数构造函数,以便每次我想获得不同的视图时都获得视图构造函数..

例如,我想这样称呼它

public IQueryable<ItemView> GetViewSelect(IQueryable<Item> myQ)
{
    return myQ.Select(GetExpression3());
}        

public IQueryable<ItemView> GetViewSelect(IQueryable<ItemDetail> myQ)
{
    return myQ.Select(GetExpression3());
}        

internal static Expression<Func<Item, ItemView>> GetExpression3()
{
    return m => GetItemView(m); 
}

internal static Expression<Func<ItemDetail, ItemView>> GetExpression4()
{
    return m => GetItemView(m.item);
}

而不是每次我像下面这样调用它时都编写相同的无参数构造函数..

internal static Expression<Func<Item, ItemView>> GetExpression3()
{
    // writing same parameterless constructor again
    return m => new ItemView
    {
        Id = m.id,
        Name = m.name,
        DetailCount = m.ItemDetail.Count
    }; 
}

internal static Expression<Func<ItemDetail, ItemView>> GetExpression4()
{
    // the same thing again
    return m => new ItemView
    {
        Id = m.item.id,
        Name = m.item.name,
        DetailCount = m.item.ItemDetail.Count
    };
}

internal static Expression<Func<ItemGroup, ItemDetail, GroupView>> 
    GetExpression2()
{
    return (m, n) => new GroupView
    {
        Id = m.id,
        Name = m.name,
        ItemDetailsTotalCount = 
            m.item.ItemDetails.Sum(nn => nn.item.itemDetails.Count),

        Item = new ItemView
        {
            Id = m.item.id,
            Name = m.item.name,
            DetailCount = m.item.ItemDetail.Count
        },
        ItemDetail = new ItemDetailView
        {
            Id = n.id,
            Name = n.name,            
            Supplier = new SupplierView
            {
                Id = n.id,
                Name = n.name,
                Email = n.email ?? "no email",
                Phone = n.phone ?? "no phone"
            }
        }
    };
}

所以我实际上是在寻找一种转换的方法

new ItemView
{
    Id = m.id,
    Name = m.name,
    DetailCount = m.ItemDetail.Count
}

进入一个无MemberInitExpression参数的构造函数,所以也许我可以像下面这样使用它而不做任何成员分配..

internal Expression<Func<Item, ItemView>> GetExpression4e
    (ParameterExpression m)
{
    // looking for something like this.. 
    MemberInitExpression ItemViewInitExpression = 
        Something("GetItemView", new Object[] {m});

    return Expression.Lambda<Func<Item, ItemView>>
        (ItemViewInitExpression, m);
}
4

1 回答 1

1
internal static Expression<Func<Item, ItemView>> GetExpression3()
{
    // writing same parameterless constructor again
    return m => new ItemView
    {
        Id = m.id,
        Name = m.name,
        DetailCount = m.ItemDetail.Count
    }; 
}

这个方法已经产生了一个MemberInitExpression. 如果你这样做

var type = GetExpression3().Body.GetType();

你会得到System.Linq.Expressions.MemberInitExpression

如果你只想传递一些参数,那么传递一些参数:

internal static Expression<Func<Item, ItemView>> GetExpression3(int id, string name, int count)    
{
    // writing same parameterless constructor again
    return m => new ItemView
    {
        Id = id,
        Name = name,
        DetailCount = count
    }; 
}
于 2013-08-19T06:42:15.730 回答