7

Entity Framework 4 を使用して ASP.Net MVC 3 アプリケーションを構築しています。以下の 2 つのコードを実行すると、両方の変数 (query1 と query2) の戻り値の型が

System.Data.Objects.ObjectQuery<Asset.Model.Equipment>

Query1 は ObjectContext の直接のインスタンスを使用しますが、Query2 はリポジトリ パターンを使用します。つまり、EquipmentService で GetEquipment を呼び出し、Equipment Repository で同じ名前のメソッドを呼び出します。Service と Repository の両方のメソッドが戻ります

IQueryable<Equipment>

どうやって、ここに私の質問があります。

using System.Linq.Dynamic;

私のコントローラーの上部に

using (AssetEntities context = new AssetEntities())
        {
            var query1 = context.Equipments
            .OrderBy("it." + sidx + " " + sord)
            .Skip(pageIndex * pageSize)
            .Take(pageSize);
        }


        var query2 = equipService.GetEquipment()
            .OrderBy(sidx + " " + sord)
            .Skip(pageIndex * pageSize)
            .Take(pageSize);

コントローラーから System.Linq.Dynamic を省略すると、Query2 内でエラーが発生します。

.OrderBy(sidx + " " + sord)

どの州

The type arguments for method 'System.Linq.Queryable.OrderBy<TSource,TKey>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,TKey>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly

query1 が System.Linq.Dynamic を使用しなくても機能するのに、その query2 を実行する必要がある理由を知っている人はいますか?

みんな、ありがとう。

4

2 に答える 2

6

最初のクエリcontext.Equipmentsには type がありObjectQuery<Equipment>ます。にObjectQuery<T>は、必要な OrderBy(string) メソッドがあります.OrderBy("it." + sidx + " " + sord)。したがって、最初のクエリは機能します。

2 番目のクエリequipService.GetEquipment()では、 typeを使用しますIQueryable<Equipment>。には、の代わりにパラメータとして使用される拡張IQueryable<T>メソッドOrderByのみがあります。だからあなたと一緒に使うには、次のようなものを書く必要がありますExpression<Func<T, TKey>>stringOrderByIQueryable<Equipment>

equipService.GetEquipment().OrderBy(e => e.equipmentID)

しかし、それはあなたが使用できるものではありません。フォームでLINQ動的クエリライブラリを提供できる別の拡張メソッドが必要ですSystem.Linq.Dynamic

多くの場合、LINQ to Entities には多くの制限がありますが、あなたの場合は LINQ to SQL よりも多くの利点があります。そのため、あなたの場合は LINQ to Entities にとどまることをお勧めします。使用する Entity Framework で直接すべての機能がネイティブにサポートされているため、パフォーマンスが向上すると確信しています。

LINQ to Entities またはメソッド (正確にはObjectQuery.Where(string predicate, params ObjectParameter[] parameters)ObjectQuery<Equipment>メソッド) をサポートしているため、jqGrid でフィルタリング/検索を比較的簡単に実装できます。の使用法はWhere(string).Where

.Where("it.equipmentID < 100")

また

.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100))

たとえば (「ObjectParameter入力していません」エラーでの「@maxId」の代わりに「maxId」の使用)。

UPDATED :回答の「UPDATED」の部分では、上記のアイデアに基づいて jqGrid でフィルタリング/検索を実装する方法を示すを見つけることができます。

于 2011-03-01T18:04:54.580 に答える
4

「it」はデフォルトのObjectQuery.Nameプロパティ値です。実際、最初のクエリを使用している場合は暗黙的な Entity SQL Order By 句を実行しますが、2 番目のクエリでは LINQ to Entities を使用しており、正しく機能するには System.Linq.Dynamic 名前空間が必要です。

于 2011-02-28T12:40:04.433 に答える