3

这是相同问题的对应物(但使用 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;
}
4

2 回答 2

1

好吧,我能够拼凑出一些东西,但我真的很想得到社区的一些意见(也许来自编写 ValueInjecter 的@Chuck Norris)......

所以重申一下这个问题......

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

因此,如果 aCompany具有称为Presidenttype的属性Employee,并且Employee具有称为HomeAddresstype 的属性,Address并且具有称为Addressstring 的属性,Line1则:

" President.HomeAddress.Line1" 将被展平为PresidentHomeAddressLine1您的视图模型上名为 " " 的属性。

为了用户服务器端排序 Dynamic Linq 需要点属性路径,而不是扁平的。我只需要 ValueInjecter 来展开 flat 属性!不是全班。

这是我想出的(从执行其他操作的方法中提取的相关逻辑:

// type is type of your unflattened domain model.
// flatProperty is property name in your flattened view model
public string GetSortExpressionFor(Type type, string flatPropertyPath)
{
    if (type == null || String.IsNullOrWhiteSpace(flatPropertyPath))
    {
        return String.Empty;
    }

    // use ValueInjecter to find unflattened property
    var trails = TrailFinder.GetTrails(flatPropertyPath, type.GetInfos(), typesMatch => true).FirstOrDefault();
    var unflatPropertyPath = (trails != null && trails.Any()) ? String.Join(".", trails) : String.Empty;

    return unflatPropertyPath;
}



// sample usage     
var unflatPropertyPath = GetSortExpressionFor(typeof(Company), "PresidentHomeAddressLine1");
// unflatPropertyPath == "President.HomeAddress.Line1"
于 2012-06-08T16:15:07.550 回答
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)

于 2012-06-08T16:35:20.993 回答