1

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

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

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

我需要做的是有那个上下文。在运行时提供客户,然后使用 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。对我来说,这不是一个动态查询,只是一个动态谓词。

4

1 回答 1

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);
于 2013-08-01T18:33:03.007 回答