1

以下はコンテキストを提供するためのもので、質問は一番下にあります

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 がわからないため、テーブルにキャストできなかったため、機能しませんでした。

これは多くの情報であることを理解していますが、私が尋ねていることをリストします。

  1. .select().select().where().select()... などを行うべきか、.join().join().where().select() を行うべきか
  2. 動的 LINQ のエラーで発生しているこの問題を回避することは可能ですか?
  3. この問題に対する別の解決策はありますか?
4

0 に答える 0