2013-01-10 25 views
0

我將嘗試詳細描述我的問題。我有以下情形。如何使用包含實體SQL連接表

1)我有3個表:商業,customoffice(海關辦事處)和cusdesc(自定義辦公室介紹)

的關係是商家在customoffice和一個customoffice有很多cusdesc。

表業務具有字段customofficeno,它是customoffice表字段cuscode的外鍵。表cusdesc具有字段cuscode,它是customoffice表的字段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(); 
      } 
     } 
    } 

能否請您給一個暗示什麼,我做錯了。

在此先感謝。

回答

1

Include操作符只是要求EF使用查詢加載相關實體。如果您不使用「包含」,則EF將僅提取BUSINESS的屬性,並且不會提取CUSTOMSOFFICE的屬性。因爲您已經在第一個包含中加載了整個CUSTOMSOFFICE實體,所以不需要「Include(」CONSOMSOFFICE.CUSDESC「)」。

我看到你將結果綁定到網格視圖,如果我理解正確,問題是「CUSTOMSOFFICE.CUSDESC」沒有顯示在gridview中。我相信這是因爲gridview試圖呈現它自己的「CUSTOMSOFFICE」對象的表示,因爲那是你綁定項目的直接屬性。爲了更好地控制gridview的「列」,我建議使用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詳細信息)。但是你不能將它綁定到你的gridview,因爲你可能遇到同樣的問題,CUSTOMSOFFICE.DESC不顯示。爲確保正確顯示,您必須確定要包含哪些屬性。例如,如果您只想顯示以下屬性集合:

  1. 業務。BUSINESSNO
  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屬性的值。

+0

嗨傑裏克,感謝您的即時回覆。我會重寫我的代碼,並儘快返回結果。 – Pavlos