Entity Framework 4でASP.Net MVC 3アプリケーションを構築しています。以下の2つのコードを実行すると、両方の変数(query1とquery2)の戻り値の型が
System.Data.Objects.ObjectQuery<Asset.Model.Equipment>
Query1はObjectContextの直接インスタンスを使用しますが、Query2はリポジトリパターンを使用します。つまり、EquipmentServiceでGetEquipmentを呼び出し、次に、Equipmentリポジトリで同じ名前のメソッドを呼び出します。サービスとリポジトリの両方のメソッドが返されます
IQueryable<Equipment>
どのように、これが私の質問です、どうしてquery2は私が含めたときにのみ機能するのですか?
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
System.Linq.Dynamicを使用せずにquery1が機能する理由を誰かが知っていますが、そのquery2を実行する必要があるのですか?
みんな、ありがとう。
最初のクエリではcontext.Equipments
種類があるObjectQuery<Equipment>
。 ObjectQuery<T>
は、 .OrderBy("it." + sidx + " " + sord)
必要なメソッドOrderBy(string)があります。したがって、最初のクエリは機能します。
2番目のクエリでは、タイプIQueryable<Equipment>
equipService.GetEquipment()
を使用します。 IQueryable<T>
は、 string
代わりにExpression<Func<T, TKey>>
をパラメーターとして持つ拡張メソッドOrderByのみがありstring
。したがって、 OrderBy
をIQueryable<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<Equipment>
はWhere(string)
メソッド(正確にはObjectQuery.Where(string predicate、params ObjectParameter [] parameters)メソッド)をサポートしているため、jqGridで比較的簡単にフィルタリング/検索を実装できます。 .Where
の使用法
.Where("it.equipmentID < 100")
または
.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100))
例えば、(代わりに「@maxId」の「MAXID」の使用ObjectParameter
エラーを入力されていません)。
更新済み : 回答の 「更新済み」の部分に、上で説明したアイデアに基づいてjqGridでフィルタリング/検索を実装する方法を示す例があります。
「it」は、デフォルトのObjectQuery.Nameプロパティ値です。実際、最初のクエリを使用しているときは、暗黙のEntity SQL Order By句を実行し、2番目のクエリではLINQ to Entitiesを使用していて、System.Linq.Dynamic名前空間が正しく機能する必要があります。