2017-06-19 121 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 –