通用类型 T 作为变量名
Generic type T as variable name
我正在使用 EntityFramework,我需要一些方法来同步传入的实体列表与数据库(覆盖记录描述或将其标记为过时):
public void Synchronize<T>(List<T> entityList)
{
//do something
}
首先,我需要从相应的 table 中获取所有数据并获取两个列表之间的差异(一个不可更改的是条目的 GUID)。
例如,如果传入的 entityList 的类型是用户,那么我需要从 "User" table 等
获取所有数据
没用:
var query = from entity in typeof(T)
select entity;
我当然可以用老办法:
switch (typeof(T).Name)
{
case "User":
var query = from user in User
select user;
//Sync with User table
break;
case "Project":
var query = from project in Project
select project ;
//Sync with Project table
break;
}
但也许有一种优雅的方式来处理泛型?因为我有很多 table 需要同步。谢谢!
您滥用泛型来处理非泛型的东西。也许您的某些代码是通用的,但您应该用另一种方法拆分该代码。
您可以使用接口来抽象出一些功能,但基本上答案是:您不应该这样做。
如果您有权访问 DbContext,您可以使用方法 Set<T>
来完成。
var query = from entity in context.Set<T>() select entity;
但要使其在您的上下文中工作,您必须至少对类型 T 施加约束,并且实体需要共享一个类型或接口。否则您无法构建查询,因为 T 可以是任何东西 (object
)。
如果你觉得使用ObjectContext没问题,你可以这样做:
var octx = (ctx as IObjectContextAdapter).ObjectContext;
var query = octx.CreateQuery<T>("SELECT VALUE v FROM " + typeof(T).Name + " AS v");
var result = query.ToList();
在此处查看有关 CreateQuery 的更多信息:https://msdn.microsoft.com/en-us/library/bb339670(v=vs.110).aspx。
我正在使用 EntityFramework,我需要一些方法来同步传入的实体列表与数据库(覆盖记录描述或将其标记为过时):
public void Synchronize<T>(List<T> entityList)
{
//do something
}
首先,我需要从相应的 table 中获取所有数据并获取两个列表之间的差异(一个不可更改的是条目的 GUID)。 例如,如果传入的 entityList 的类型是用户,那么我需要从 "User" table 等
获取所有数据没用:
var query = from entity in typeof(T)
select entity;
我当然可以用老办法:
switch (typeof(T).Name)
{
case "User":
var query = from user in User
select user;
//Sync with User table
break;
case "Project":
var query = from project in Project
select project ;
//Sync with Project table
break;
}
但也许有一种优雅的方式来处理泛型?因为我有很多 table 需要同步。谢谢!
您滥用泛型来处理非泛型的东西。也许您的某些代码是通用的,但您应该用另一种方法拆分该代码。
您可以使用接口来抽象出一些功能,但基本上答案是:您不应该这样做。
如果您有权访问 DbContext,您可以使用方法 Set<T>
来完成。
var query = from entity in context.Set<T>() select entity;
但要使其在您的上下文中工作,您必须至少对类型 T 施加约束,并且实体需要共享一个类型或接口。否则您无法构建查询,因为 T 可以是任何东西 (object
)。
如果你觉得使用ObjectContext没问题,你可以这样做:
var octx = (ctx as IObjectContextAdapter).ObjectContext;
var query = octx.CreateQuery<T>("SELECT VALUE v FROM " + typeof(T).Name + " AS v");
var result = query.ToList();
在此处查看有关 CreateQuery 的更多信息:https://msdn.microsoft.com/en-us/library/bb339670(v=vs.110).aspx。