动态LINQ到实体,其中EntityType是通用的

时间:2013-08-01 18:27:29

标签: c#

首先,我是EF和LINQ的菜鸟,甚至是较小程度的C#。对不起,如果我的问题措辞不当或只是愚蠢的话。

我一直在寻找这方面的一个例子,但无济于事。我正在尝试创建一个“搜索框架”,它可以接受我模型中的任何实体类型,并向用户显示一个用于进行自定义搜索的UI。

虽然这里和其他地方有10个或者100个问题与“动态LINQ”或“动态查询”相关,但它们共同的一点似乎是实体类型在编译时是已知的。如果我们在编译时不知道怎么办?意思是,框架只接受开发人员的任何实体类型,然后从那里构建LINQ查询。

我需要做的是拥有那个context.Customers在运行时提供,然后使用像PredicateBuilder这样的东西建立“Where(s)”,很可能是PredicateBuilder。

如下所示:

var query = from c in context.Customers select c;

更像是:

var query = from c in AnyContext.AnyEntity select c;

我想我的问题是我可以使用哪个对象在我的编译代码中保存参数AnyContext和AnyEntity,以便在运行时可以用真实的上下文和实体替换它们?

我仔细研究了PredicateBuilder和System.Linq.Dynamic示例,但它们都在设计时定义了EntityType。对我来说,这不是动态查询,只是动态谓词。

1 个答案:

答案 0 :(得分:0)

var query = from c in AnyContext.AnyEntity select c;

这与:

完全相同
var query = AnyContext.AnyEntity;

换句话说,如果用户选择了上下文类型和实体集属性,则可以从以下内容开始:

var query = (IObjectSet<T>) GetObjectSetViaReflection(context, propertyName);

另外,我不确定其他版本的Entity Framework有这个,但是从.NET 4.5开始,您可以调用CreateObjectSet来生成查询:

IObjectSet<T> query = context.CreateObjectSet<T>();
// or, if the context has multiple properties with the same type, 
// you can specify a name.
IObjectSet<T> query = context.CreateObjectSet<T>(propertyName);