如何正确初始化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不是一个类型,而是在执行时显示类型是什么。我也尝试过使用动态关键字,但没有成功。我怎么解决这个问题?

如何正确初始化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,
        ...
    });

最后,您可以在服务器端创建一个视图,在personpersonHistory之间执行union all,并使用此视图作为查询的基础。