首先,我是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。对我来说,这不是动态查询,只是动态谓词。
答案 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);