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などを使用)...

したがって、aにタイプとCompany呼ばれるプロパティがあり、タイプと呼ばれるプロパティがあり、文字列プロパティが呼び出される場合、次のようになります。PresidentEmployeeEmployeeHomeAddressAddressAddressLine1

" "は、ビューモデルのPresident.HomeAddress.Line1""というプロパティにフラット化されます。PresidentHomeAddressLine1

サーバー側での並べ替えをユーザーに行うには、動的Linqには、フラット化されたものではなく、点線のプロパティパスが必要です。フラットプロパティのみをアンフラット化するためにValueInjecterが必要です!クラス全体ではありません。

これが私が思いついたものです(他のことを行うメソッドから抽出された関連するロジック:

// 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 に答える