2012-02-24 16 views
6

MVC3、Entity Framework 4.1のコードが最初です。ソートナビゲーションプロパティの動的LINQ式

2つのテーブル

モデルでの作業:ページが2でグリッドを表示している

public virtual IQueryable<ProgramMaster> GetQueryableSort(string sortField="", string sortDirection="") 
    { 
     IQueryable<ProgramMaster> query = _dbSet; 
     ParameterExpression pe = Expression.Parameter(typeof(ProgramMaster), string.Empty); 
     MemberExpression property = Expression.PropertyOrField(pe, sortField); 
    //get a exception here if the sort field is of navigation property       (University.UniversityName) 
     LambdaExpression lambda = Expression.Lambda(property, pe); 
     if (sortDirection == "ASC") 
     orderbydir = "OrderBy"; 
     else 
     orderbydir = "OrderByDescending"; 
     MethodCallExpression call = Expression.Call(typeof(Queryable), 
     orderbydir, new Type[] { typeof(TEntity), property.Type }, query.Expression, Expression.Quote(lambda)); 

     var returnquery = (IOrderedQueryable<ProgramMaster>)query.Provider.CreateQuery<ProgramMaster>(call); 
     return returnquery; 
    } 

public class UniversityMaster 
{ 
    [Key] 
    public string UniversityId { get; set; } 
    public string UniversityName { get; set; } 

} 

public class ProgramMaster 
{ 
    [Key] 
    public string ProgramId { get; set; } 
    public string ProgramName { get; set; } 
    public string UniversityId { get; set; } 
    public virtual UniversityMaster University { get; set; } // navigation property 

} 

ソートするための動的な表現(単なるスイッチのcase文を回避するため)カラムwebgridを使用したプログラム名と大学名。 Program Name列のソート作業は問題ありません。ただし、UniversityMasterで分類されている場合は失敗し、ProgramMasterではExpression.PropertyOrFieldがこのプロパティを検索します。ここでは例外がある:

University.UniversityNameは「型のメンバではありません」App.Core.Model.ProgramMaster

私の質問は、私は私のモデルクラスのナビゲーションプロパティのためにこの作業を行う方法です。

私はシナリオを説明することができました。どんな助けもありがとうございます。

答えて

0

これは、MemberExpressionがパラメータにUniverty.UniversityNameという名前のメンバーを呼び出そうとしているからです。あなたがしたいことは、パラメータ上のUniverityという名前のメンバーに電話をしてから、UniversityNameを呼び出してください。効果的には、を反復的にに解決する必要があります。

1

Microsoftには、文字列を使用してLINQクエリの特定の部分を動的に構築するために使用できるDynamicQueryableクラスがあります。これにより、myQuery.OrderBy( "University.UniversityName")と言うことができ、式の構築を処理します。同じライブラリは、SELECT句とWHERE句の動的構築もサポートしています。

Loresoftの優秀なEntityFramework.Extendedパッケージの一部としてソースのコピーを見つけることができます。 Microsoftのファイルはhttps://github.com/loresoft/EntityFramework.Extended/blob/master/Source/EntityFramework.Extended/Dynamic/DynamicQueryable.cs

です