2012-05-09 15 views
4

開発中のWebアプリケーション(ASP.Net MVC)では、私はtelerikグリッドを使用しています。グリッドは大きなテーブルなので、私のリストのIQueryableにバインドされています。リストにフィルタを適用してから、この結果を実行します。結合されたテーブルを使用して10,000行をダウロードしません。フィルタでは、行のみを使用します。Asp MVC Telerik GridおよびEntity FrameworkのEnumを扱う

グリッドのフィルタ/オーダーを使用しています(このページには本当に必要ですが、これは重要な機能の1つです)。

メイン列(データの種類を決定する)の1つは列挙型です。

問題は、フィルタリング/ソートしようとするとすぐに"Specified type member is not supported in linq to entities"が表示されてしまうことです。

idを使用すると、フィルタ/順序はintになり、ユーザーはidを知ることができないため、enum(およびマップされたintではなく)にバインドしました。外国のテーブル。

私はすべてのグリッドパラメータ(URLにあります)を実装することはできません(私はすべて、または何もしません)。正しくフィルタリングしてください。

回避策がありますか?

答えて

5

に列挙型をサポートしている必要があり、次のEF/LINQ/C#バージョン、待ちますモデル:

public partial class Project 
{  
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Status { get; set; } 
} 

とStatusプロパティは、あなたの列挙型の値を示し、その後、あなたはこの列挙しました。そして、ちょうどこのような新しいのViewModelを作成

public enum ProjectStatuses 
{ 
    Current = 1, 
    Started = 2, 
    Stopped = 3, 
    Finished = 4, 
} 

public class ProjectDetails 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public int Status { get; set; } 
     public ProjectStatuses StatusValue { get { return (ProjectStatuses) Status; } } 
     // This property to display in telerik ClientTemplate 
     public string StatusName { get { return Enum.GetName(typeof (ProjectStatuses), Status); } }    
    } 

そして、私は拡張メソッドを愛しているから、私はこの1つ追加します:

public static class ModelListExtensions 
{ 
     public static IQueryable<ProjectDetails> ToViewModelDetails(this IQueryable<Project> modelList) 
     { 
      return modelList.Select(m => new ProjectDetails 
              { 
               Id = m.Id, 
               Name = m.Name, 
               Status = m.Status, 
               }; 
     } 
} 

を更新:

ここでは、コントローラ

です

そして、これはビュー

@model IEnumerable<ProjectDetails> 
@{ 
    Html.Telerik() 
     .Grid(Model) 
     .Name("ProjectsGrid") 
     .Sortable() 
     .Filterable() 
     .EnableCustomBinding(true) 
     .DataBinding(dataBinding => dataBinding 
             .Ajax() 
             .Select("ReGetIndex", "Projects")) 
     .Pageable(page => page.Style(GridPagerStyles.PageSizeDropDown | GridPagerStyles.NextPreviousAndNumeric).Total(ViewBag.Total)) 
     .Columns(column => 
        { 
         column.Bound(m => m.Id).Hidden(true); 
         column.Bound(m => m.Name); 
         column.Bound(m => m.StatusValue).ClientTemplate("<#= StatusName #>"); 
        }) 
     .Render(); 
} 

アップデートです:

:あなたは少なくとも一つのソート順を強制したい場合は、このようなものを使用することができ

if (!command.SortDescriptors.Any()) { command.SortDescriptors.Add(new SortDescriptor {Member = "YourDefaultProperty"}); } 
+0

モデルのプロパティにグリッドをバインドするときにこれを行うことはできますか? – J4N

+0

@ J4N ViewModelクラスを追加したくない場合は、モデルを部分クラスで拡張するだけで私たちの例では、2つのプロパティ "StatusValue"と "StatusName"を入れてください –

+0

実際に、ビュー内のグリッドにデータをどのようにバインドしているかを私に実際に示すことができますか? – J4N

0

あなたの代わりに列挙型のクラスを使用します(ただし、列挙型を使用した場合、それは良かったので、それはだ)天気を本当に選択(または少数の迷惑な選択肢)

を持っていません。

または、あなたの列挙型を「疑似ソート」し、マップされたintを使用します。もちろん

public enum TT 
    { 
     Brown = 0, 
     Green = 1 
    } 

、あなたのDB内の実際の件のデータ(マッピングされたint)をチェックし、新しい秩序(影響を与えることなく、列挙順序を変更することはできません)に準拠するようにそれらを更新する必要があります。また、既存の列挙型の値の間に値を挿入するたびに、これを行う必要があります。

それとも、私はあなたのエンティティモデルがどのように見えるかわからないが、私はあなたがこのような何かをしたと仮定しますlinq2entities

+0

私はできません。彼のウェブサイトはローカライズされているので、時にはそれが最初に来るブラウン、時にはそれがグリーンになる。そして、ここにクラスを置くことはできません。データベースの設計は数ヶ月前にAPI /バックアップ/ニーズのためにロックされています(あなたが言ったように、これは本当にDBにとって最良の選択でした。 – J4N