我有这段代码:
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不是一个类型,而是执行时的类型是什么类型。我也尝试过使用动态关键字,但没有成功。 我该如何解决这个问题?
答案 0 :(得分:3)
创建一个表示这些表共有的数据的接口:
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,
...
});
答案 1 :(得分:0)
您可以使用conditional operator。
<td ng-bind-html-unsafe="item.name"></td>
其他技术包括将EF中模型浏览器中var select = something == otherthing ?
dbContext.tbl_person.Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
}) :
dbContext.tbl_personHistory.Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
表上的基本类型更改为与personHistory
表相同的实体。那么你可以这样做......
person
另一个选择是分配和连接所有共享属性,然后将第一个表转换为 var select = (
something == otherthing ?
dbContext.tbl_person :
dbContext.tbl_personHistory
).Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
或&#39; IEnumerable`
IQueryable<IPerson>
最后,您可以在服务器端创建一个在 var select = (
something == otherthing ?
(IQueryable<IPerson>)dbContext.tbl_person :
dbContext.tbl_personHistory
).Select(item => new PersonGridRow
{
PersonID = item.PersonID,
...
});
和union all
之间执行person
的视图,并使用此视图作为查询的基础。