如何正确初始化var类型
本文关键字:类型 var 初始化 何正确 | 更新日期: 2023-09-27 18:16:52
我有这段代码:
DatabaseContext dbContext = modul.CreateContext();
var returnvalue = dbContext.tbl_person
.ToArray()
.Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
我需要使它更动态,所以它使用相同的选择,但不同的表。
我想这样做:
DatabaseContext dbContext = modul.CreateContext();
var selection;
if(some condition)
{
selection = dbContext.tbl_person;
}
else
{
selection = dbContext.tbl_personHistory
}
var returnvalue = selection
.ToArray()
.Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
两个表是相同的。我知道var不是一个类型,而是在执行时显示类型是什么。我也尝试过使用动态关键字,但没有成功。我怎么解决这个问题?
创建一个表示这些表共有数据的接口:
public interface IPerson
{
int PersonID {get;}
//...
}
然后让你正在使用的两个表的两个实体类型实现该接口。这样做之后,就可以使用该接口声明变量:
DatabaseContext dbContext = modul.CreateContext();
IQueryable<IPerson> selection;
if(some condition)
selection = dbContext.tbl_person;
else
selection = dbContext.tbl_personHistory
var returnvalue = selection
.Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
您可以使用条件运算符。
var select = something == otherthing ?
dbContext.tbl_person.Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
}) :
dbContext.tbl_personHistory.Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
其他技术包括在EF的模型浏览器中将personHistory
表的基本类型更改为与person
表相同的实体。然后你可以这样做…
var select = (
something == otherthing ?
dbContext.tbl_person :
dbContext.tbl_personHistory
).Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
另一种选择是分配和接口所有的共享属性,然后将第一个表强制转换为IQueryable<IPerson>
或'IEnumerable '
var select = (
something == otherthing ?
(IQueryable<IPerson>)dbContext.tbl_person :
dbContext.tbl_personHistory
).Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
最后,您可以在服务器端创建一个视图,在person
和personHistory
之间执行union all
,并使用此视图作为查询的基础。