2017-05-24 46 views
0

是否有可能在运行时将类型传递给IQueryable来实现。在运行时向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(); 

后来我需要用这个测试变量来动态查询数据。

也请建议任何替代方案来解决这种情况。

+0

不是这样的,没有。你可以制定一个通用的方法,但没有上下文就无法说清楚。 –

+1

试图做到这一点表明您的程序结构存在较大的问题。你在这里的最终目标是什么? – MrZander

+0

我认为你可以,但是你的服务层变得非常复杂,因为你需要动态地将一个类型与一个仓库(表)进行映射。另外,处理导航属性变得非常复杂。 – Sparrow

回答

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>(); 
1

如果你有如果你有一个

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

: - 在IQueryable类型你需要,你可以使用一个通用的方法来捕获的类型的示例中,这一个返回正确类型的空例如物品退回,您可以使用扩展,如:

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

无论是在结果上使用AsQueryable

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

或创建一个IQueryable变种 - 不幸的是,没有一个真正的IQueryable相当于到Enumerable.Empty

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

var test = EmptyQueryByExample(queryObject); 

否则,如前所述,你是在REFL世界这可能表明你做错了什么。问题是你会发现在这种情况下你只能得到test的类型为object,因为编译器不知道type代表什么,例如除非你想使用dynamic(并且你不应该那样做),否则编译时速度很快。