在运行时将类型传递给IQueryable

时间:2017-05-24 20:58:14

标签: c# .net entity-framework linq

是否可以将类型传递给IQueryable以在运行时实现。

像,

//Get type at runtime
Type type = Type.GetType("fully qualified class name");


IQueryable<type> test = // <-returned object of this type

实际问题如下: 下面我能够获得具有特定类型的右侧对象,但这不会转换为查询变量的类型。此外,我将知道查询类型。

Dictionary<string, Type> myDictionary = new Dictionary<string, Type>()
                {
                    { "tableName", typeof(tableName) }
                };

//Below I am able to get right side object with specific type, but that is not casting to type of query variable. Also I will have known type for query.
IQueryable<Type> query= EFContext.Set(myDictionary[tableName]).AsQueryable();

稍后使用此查询对象通过动态传递select / where条件来选择数据。

   var data = query.Select(x=> new
                {
                    id= x.id,
                    name= x.name .. etc
                }).ToList();

稍后我需要使用此测试变量来动态查询数据。

另外,请建议任何其他方法来解决此问题。

2 个答案:

答案 0 :(得分:2)

如果你有一个你需要的IQueryable类型的例子,你可以使用泛型方法来捕获类型 - 这个返回一个正确类型的null:

public static T NullByExample<T>(this T _) where T : class => (T)null;

如果您有返回项目的示例,则可以使用以下扩展名:

public static IEnumerable<T> EmptyByExample<T>(this T _) => Enumerable.Empty<T>();

在结果上使用AsQueryable

var test = EmptyByExample(classObject).AsQueryable();

或创建IQueryable变体 - 遗憾的是,IQueryable与[{1}}等效的确不是Enumerable.Empty

public static IQueryable<T> EmptyQueryByExample<T>(this T _) => Enumerable.Empty<T>().AsQueryable();

var test = EmptyQueryByExample(queryObject);

否则,如上所述,你处于反思的世界,这可能表明你做错了什么。问题是,在这种情况下,您会发现test只能使object成为type类型,因为编译器无法知道var代表什么,例如dynamic是编译时的简写,除非您想使用UITableViewController(并且您也不应该这样做)。

答案 1 :(得分:0)

有很多方法可以通过反思来做你所要求的,但可维护性会受到限制。您可能最好为类型创建共享接口并编写通用方法,如下所示:

interface IMyInterface
{
    string SomeProperty {get;set;}
}

class MyClass : IMyInterface
{
    public string SomeProperty {get;set;}
}

IQueryable<T> SomeMethod<T>() where T : IMyInterface, new()
{
    var result = new List<T>() { 
        new T() { SomeProperty = "a"}, 
        new T() { SomeProperty = "b"} 
    };
    return result.AsQueryable();
}

因此,对泛型方法的调用可能是:

var temp = SomeMethod<MyClass>();