2017-06-19 160 views
-1

我有兩個表,其模式是在:LINQ的多連接查詢

表1: -

ID int 
first_name string 
last_name string 

表2: -

ID int 
Address1 
Address2 

我有一個視圖模型如下,其中我我使用Linq.Join()將這兩個表中的數據連接到第三個表中,如下所示: -

public class VM_JoinData:INotifyPropertyChanged 
{ 
    public int ID {get;set;} 
    public string first_name {get;set;} 
    public string last_name {get;set;} 
    public string Address1 {get;set;} 
    public string Address1 {get;set;} 
    private List<DM_JoinData> AllViewData = null; 
    public VM_JoinData() 
    { 
     AllViewData=(from Tab1 in Table_1 
         join Tab2 in Table2 on Tab1.ID equals Tab2.ID 
         select new 
         DM_JoinData 
         { 
         ID=Tab1.ID, 
         first_name=Tab1.first_name, 
         last_name=Tab1.last_name, 
         Address1=Tab2.Address1, 
         Address2=Tab2.Address2 
         } 
       ).ToList<DM_JoinData>(); 
     } 
} 

我需要在我的ViewModel中加入許多DataModel並將常用字段提取到List中,但每次我需要創建一個新的ViewModel時,首先必須創建一個DataModel來表示新的所有字段ViewModel,然後我必須實例化一個新的DataModel,然後將這個DataModel實例的每個字段分別與我的Linq.Join()查詢中的聯接元素的相應值分配,如下所示。這會變得很麻煩,因爲數據模型和字段數量增加。

注:

1)假設我已經在VM_JoinData的所有屬性的setter,它是我的ViewModel實現INotifyPropertyChanged的。

2)Linq.Join中的Table_1和Table_2是列表<>或來自EntityFramework的一些DBContext。

我該如何創建一個新的ViewModel,而無需首先創建一個副本DataModel,而不必在Linq.Join()查詢中分別指定ViewModel中的List中的DataModel的每個屬性?

回答

1

當然,您需要從數據庫中實際獲取數據,然後才能使用任何數據值。不過你不需要創建一個List<DM_JoinData>

查詢必須返回某種保存實際值的數據對象。你應該從哪裏得到這些東西?

你可以使用匿名類型只是發出查詢和設置視圖模型的屬性:

public class VM_JoinData : INotifyPropertyChanged 
{ 
    public int ID { get; set; } 
    public string first_name { get; set; } 
    public string last_name { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 

    public VM_JoinData() 
    { 
     var query = (from Tab1 in Table_1 
        join Tab2 in Table2 on Tab1.ID equals Tab2.ID 
        select new 
        { 
         ID = Tab1.ID, 
         first_name = Tab1.first_name, 
         last_name = Tab1.last_name, 
         Address1 = Tab2.Address1, 
         Address2 = Tab2.Address2 
        }).FirstOrDefault(); 

     if (query != null) 
     { 
      ID = query.ID; 
      first_name = query.first_name; 
      last_name = query.last_name; 
      Address1 = query.Address1; 
      Address2 = query.Address1; 
     } 
    } 
    ... 
} 

另一種選擇是創建視圖模型之前發出查詢:

VM_JoinData vm = (from Tab1 in Table_1 
        join Tab2 in Table2 on Tab1.ID equals Tab2.ID 
        select new VM_JoinData 
         { 
          ID = Tab1.ID, 
          first_name = Tab1.first_name, 
          last_name = Tab1.last_name, 
          Address1 = Tab2.Address1, 
          Address2 = Tab2.Address2 
         }).FirstOrDefault(); 
+0

tx mm8,我已經嘗試了第二種方法,並且弄傷了我的手:-)。因爲每次創建一個ViewModel的新實例時,它會激發構造函數,然後構造一個VM_Model的每個實例都不需要的其他列表。然而,我會嘗試第一個選項,它會讓我省卻我每次創建一個新的ViewModel都會創建一個新的DataModel。謝謝mm8 –