0

私の問題を詳細に説明しようと思います。次のシナリオがあります。

1.) ビジネス、customoffice(税関)、cusdesc(税関の説明) の 3 つのテーブルがあります。

この関係は、ビジネスが税関にあり、1 つの税関に多くの cusdesc があるという関係です。

テーブル business には、customoffice テーブルのフィールド cuscode への外部キーであるフィールド customofficeno があります。テーブル cusdesc には、customoffice テーブルのフィールド cuscode への外部キーであるフィールド cuscode があります。

目的は、エンティティフレームワークを使用して、税関と税関の説明を含むビジネスを選択することです。

2.) コード

データグリッドを埋めるプロシージャ FillData があります。私の目的は、3 つのテーブルのフィールドを表示することです。テーブル「Business」と「Customoffice」のデータを表示できましたが、テーブル「cusdesc」を介してカスタムオフィスの説明を表示し、フィールド「CSNAME」をより具体的にする必要があります。

3.) 私の問題は、("CUSTOMSOFFICE.CUSDESC") を含めると、結果にはテーブル "CUSDESC" からのデータが含まれず、条件に一致するレコード数だけが含まれるため、フィールド "CSNAME" にアクセスできないことです。

以下手順です。

using (var _context = new ReftabEntities())
        {
            try
            {
                SetGlobalValues();


                ObjectQuery<BUSINESS> q_business = _context.BUSINESS.Where("it.BUSINESSNO=" + int.Parse(pv_businessno)).Where(string.Format("(it.BUSINESSSTART <= DATETIME'{0:yyyy-MM-dd HH:mm}') and (it.BUSINESSCLOSED >= DATETIME'{0:yyyy-MM-dd HH:mm}')", pv_date)).Include("CUSTOMSOFFICE").Include("CUSTOMSOFFICE.CUSDESC");


                gvBusinessList.Caption = "Total records selected: " + q_business.Count();
                gvBusinessList.DataSource = q_business;
                gvBusinessList.DataBind();
            }
            catch (Exception e)
            {
                errorPopup.Text = e.Message;
                errorPopup.ShowOnPageLoad = true;
            }
            finally
            {
                _context.Dispose();
            }
        }
    }

私が間違っていることのヒントを教えてください。

前もって感謝します。

4

1 に答える 1

1

Include 演算子は、クエリを使用して関連するエンティティを読み込むように EF に要求するだけです。"Include" を使用しない場合、EF は BUSINESS のプロパティのみを抽出し、CUSTOMSOFFICE のプロパティは抽出しません。最初のインクルードで CUSTOMSOFFICE エンティティ全体を既に読み込んでいるため、「Include("CONSOMSOFFICE.CUSDESC")」は必要ありません。

結果をグリッド ビューにバインドしていることがわかりました。私の理解が正しければ、問題は "CUSTOMSOFFICE.CUSDESC" がグリッド ビューに表示されていないことです。これは、バインドしているアイテムの直接のプロパティであるため、グリッドビューが「CUSTOMSOFFICE」オブジェクト自体の表現をレンダリングしようとするためだと思います。グリッドビューの「列」をより細かく制御するには、LINQ を使用して、クエリの結果を明示的に表示したいものに変換することをお勧めします。

BUSINESSNO、BUSINESSSTART、および BUSINESSCLOSED はビジネス エンティティ自体のプロパティであり、BUSINESSNO が主キーであると想定しています。クエリを次のように書き直します。

var q_business = _context.BUSINESS.Include(b=>b.CUSTOMSOFFICE)
                          .Where(p => p.BUSINESSNO == int.Parse(pv_businessno)
                                      && p.BUSINESSSTART <= DateTime.Parse(pv_date)
                                      && p.BUSINESSCLOSED >= DateTime.Parse(pv_date) )
                          .FirstOrDefault();

このクエリは、指定された pv_businessno に一致し、日付基準に該当するビジネスの詳細 (関連する CUSTOMSOFFICE の詳細を含む) を抽出します。ただし、CUSTOMSOFFICE.DESC が表示されないという同じ問題が発生する可能性があるため、これをまだグリッドビューにバインドすることはできません。適切に表示するには、含めるプロパティを特定する必要があります。たとえば、以下の一連のプロパティのみを表示する場合:

  1. BUSINESS.BUSINESSいいえ
  2. BUSINESS.BUSINESSNAME
  3. BUSINESS.CUSTOMSOFFICE.CUSCODE
  4. BUSINESS.CUSTOMSOFFICE.CUSDESC

これらのプロパティを明示的にすぐに含めるように出力を変換する必要があります。

var q_business = _context.BUSINESS.Include(b=>b.CUSTOMSOFFICE)
                          .Where(b => b.BUSINESSNO == int.Parse(pv_businessno)
                                      && b.BUSINESSSTART <= DateTime.Parse(pv_date)
                                      && b.BUSINESSCLOSED >= DateTime.Parse(pv_date) )
                          .Select(b => new {BusinessNo = b.BUSINESSNO,
                                            BusinessName = b.BUSINESSNAME,
                                            CustomsOfficeCode = b.CUSTOMSOFFICE.CUSCODE,
                                            CustomsOfficeDesc = b.CUSTOMSOFFICE.CUSDESC } ) //This Select statement creates a new anonymous type that has Businessno, BusinessName, CustomsOfficeCode, and CustomsOfficeDesc properties
                          .FirstOrDefault();

これを gridview にバインドすると、CUSDESC プロパティの値を表示できるはずです。

于 2013-01-10T09:12:51.767 に答える