通用类型T作为变量名称

Sze*_*zer 2 c# generics entity-framework

我正在使用EntityFramework,我需要一些方法来将实体的传入列表与数据库同步(覆盖记录描述或将它们标记为过时):

    public void Synchronize<T>(List<T> entityList)
    {
        //do something
    }
Run Code Online (Sandbox Code Playgroud)

首先,我需要从相应的表中获取所有数据并获得两个列表之间的差异(一个不可更改的东西是条目的GUID).例如,如果传入的entityList的类型是User,那么我需要从"User"表等获取所有数据.

它不起作用:

        var query = from entity in typeof(T)
                    select entity;
Run Code Online (Sandbox Code Playgroud)

当然我可以用旧的方式做到:

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;
        }
Run Code Online (Sandbox Code Playgroud)

但也许有一种优雅的方式来处理通用?因为我有很多表要同步.谢谢!

Jeh*_*hof 5

如果您有权访问DbContext,则可以使用该方法Set<T>执行此操作.

var query = from entity in context.Set<T>() select entity;
Run Code Online (Sandbox Code Playgroud)

但是为了使它在您的上下文中工作,您必须至少对类型T施加约束,并且实体需要共享类型或接口.否则你无法建立你的查询,因为T可能是任何东西(object).