我有两个表,其架构如下:
表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的每个属性?
答案 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();