如何使用ValueInjecter基于展平属性的名称查找源属性

时间:2012-06-07 15:33:23

标签: c# dynamic-linq valueinjecter

这是same question (but with AutoMapper)的对应物。 我使用ValueInjecter并感兴趣,如果有解决方案。

简化代码示例:

// get a list of viewModels for the grid.
// NOTE: sort parameter is flattened property of the model (e.g. "CustomerInvoiceAmount" -> "Customer.Invoice.Amount"
// QUESTION: how do I get original property path so I can pass it to my repository for use with Dynamic LINQ?
public HttpResponseMessage Get(string sort)
{
    var models = _repo.GetAll(sort) // get a list of domain models
    var dto = _mapper.MapToDto(models); // get a list of view models that are flattened  via dto.InjectFrom<FlatLoopValueInjection>(models);

    var response = new HttpResponseMessage();
    response.CreateContent(vehicles);

    return response;
}

2 个答案:

答案 0 :(得分:1)

好吧,我能够把一些事情搞砸了但是真的想要社区的一些意见(也许是来自编写ValueInjecter的@Chuck Norris)......

所以要重申这个问题......

  • 您拥有在视图中使用的展平视图模型。
  • View有一个网格,其列是所述视图模型的属性。
  • 当用户点击列时,sort = columnName将传递给控制器​​
  • 所以现在您需要将展平的属性名解码为原始对象图,以便将其传递到您的存储库以进行服务器端排序(例如,使用动态表达式APi,动态LINQ等)......

因此,如果Company具有President类型的Employee属性,而Employee具有类型为HomeAddress的{​​{1}}属性,则Address具有名为Address的字符串属性,然后:

Line1”将在视图模型上展平为名为“President.HomeAddress.Line1”的属性。

为了用户服务器端排序Dynamic Linq需要点状属性路径,而不是扁平化路径。我需要ValueInjecter才能 仅展开平面属性! 不是整个类。

以下是我提出的内容(从执行其他操作的方法中提取的相关逻辑:

PresidentHomeAddressLine1

答案 1 :(得分:0)

另一种方法是使用TrailFinder

IEnumerable<IList<string>> GetTrails(string upn, IEnumerable<PropertyInfo> all, Func<Type, bool> f)

它由UberFlatter使用,如下所示:

var trails = TrailFinder.GetTrails(flatPropertyName, target.GetType().GetInfos(), f);

f Func检查end属性的类型是否匹配某个条件(可能在你的情况下你可以返回true)