Linq多个连接查询

时间:2017-06-19 09:24:13

标签: wpf linq

我有两个表,其架构如下:

表1: -

ID int
Address1
Address2

表2: -

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如下所示,我使用Linq.Join()将这两个表中的数据连接成第三个表,如下所示: -

@Configuration
@EnableMongoRepositories("com.lab.repository")
public class DatabaseConfiguration  extends AbstractMongoConfiguration{

    @Value("${spring.data.mongodb.host}")
    private String host;

    @Value("${spring.data.mongodb.port}")
    private Integer port;

    @Value("${spring.data.mongodb.username}")
    private String username;

    @Value("${spring.data.mongodb.database}")
    private String database;

    @Value("${spring.data.mongodb.password}")
    private String password;

    @Bean
    @Override
    protected String getDatabaseName() {
        return database;
    }

    @Override
    public Mongo mongo() throws Exception {
        return new MongoClient(host + ":" + port);
    }
} 

我需要加入许多DataModel并将公共字段提取到List&lt;&gt;在我的ViewModel中,但每次我需要创建一个新的ViewModel时,我首先必须创建一个表示新ViewModel的所有字段的DataModel,然后我必须实例化一个新的DataModel然后分配这个DataModel的每个字段实例单独使用其Linq.Join()查询中的连接元素的相应值,如此处所示。随着DataModel的数量和字段数量的增加,这变得很麻烦。

注:

1)假设我已经在VM_JoinData的所有属性的setter中实现了INotifyPropertyChanged,这是我的ViewModel。

2)Linq.Join中的Table_1和Table_2是Lists&lt;&gt;或来自EntityFramework的一些DBContext。

如何在不首先创建副本DataModel的情况下创建新的ViewModel,而无需在Linq.Join()查询中单独指定ViewModel中List中的DataModel的每个属性?

1 个答案:

答案 0 :(得分: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();