以下はコンテキストを提供するためのもので、質問は一番下にあります
ASP.NET MVC 4 を使用して完全に動的な API を構築しようとしています。データベースは LINQ to SQL によって抽象化されています。
私のリポジトリクラスは、残りのクエリを表す配列を受け取ります。たとえば
http://myUrl.com/countries/states/suburbs/24/street/
、配列に変わります
[countries,states,suburbs,24,street]
リポジトリでその配列を次のようなものに変換したい(これは疑似コードです):
context.countries.select("states").select("suburbs").where("suburbs.ID == 24").select("street")
私の考えは、最新のオブジェクトを使用して、配列の外側の定数オブジェクトを使用して配列をループすることです。
object currentContextObj = null;
object currentUrlPart = null;
IQueryable<object> queryResult = null;
for (int i = 0; i < urlArray.Count(); i++)
{
リフレクションを使用してコンテキストを理解し、配列の最初のビットを見つけます。
if (currentContextObj == null)
{
if (currentUrlPart.GetType() != typeof(string))
throw new ArgumentException("URL part '" + currentUrlPart + "' is invalid");
currentContextObj = ((IEnumerable<object>)context.GetType().GetProperty((string)currentUrlPart).GetValue(context, null)).AsQueryable();
}
次にループを終了し、次に動的linqでselectステートメントを実行します
else if (currentUrlPart.GetType() == typeof(string))
{
currentContextObj = ((IQueryable)currentContextObj).Select((string)currentUrlPart).AsQueryable();
}
これは、再びループするまで正常に動作します。配列の 3 番目の部分で、currentContextObj はクエリ可能ではなく、データ クエリです。デバッグ時にカーソルを合わせると、生成された SQL ステートメントが表示されるため、同じ((IQueryable)currentContextObj).Select((string)currentUrlPart).AsQueryable();
ものを実行するとエラー:
No property or field 'Suburbs' exists in type 'EntitySet 1'
.
型はすべて匿名であるため、動的 linq を使用しています。私の他の試みは、列挙可能なクラスの選択メソッドを見つけて、currentContextObj でそれを呼び出そうとしました。currentContextObj がテーブルのときに enumerable にキャストしようとしていて、実行時まで T がわからないため、テーブルにキャストできなかったため、機能しませんでした。
これは多くの情報であることを理解していますが、私が尋ねていることをリストします。
- .select().select().where().select()... などを行うべきか、.join().join().where().select() を行うべきか
- 動的 LINQ のエラーで発生しているこの問題を回避することは可能ですか?
- この問題に対する別の解決策はありますか?