2015-02-05 65 views
0

我有一个基于Entity Framework构建的Service Repository模式。从LINQ Queryable传递表达式

该服务具有返回IEnumerable的方法,例如Find(IQuery查询)。

IQuery对象是我们自己的查询对象类型,我们将字符串转换为暴露IQueryable的存储库可以使用的IQueryable表达式。

我想要做的是能够在客户端编写一个查询,并通过服务传递,以便我们可以利用静态类型和linq样式查询,而不是构建我们自己的查询对象形成。

换句话说,我希望能够做一些事情,如:

var query = new List<Type>().Where(x => x.Property == "argument").AsQueryable(); 
service.find(query); 

然后我会把它创建可查询或表达式传递给我的信息库和类似的工作。

这种事情是可能的,还是我必须从头开始构建表达式?这似乎应该是可能的,但我真的不知道从哪里开始或看到如何共享这样的表达式的例子。

+0

哪一部分表达的由客户通过?属性密钥?价值? – haim770 2015-02-05 15:43:34

+0

听起来像你应该直接使用EF,因为构建在它上面的平台实际上并没有为你增加价值,而是去掉了价值。 – Servy 2015-02-05 15:44:44

+0

@servy这种方式肯定会更容易些,但其价值来源于不依赖于应用程序其余部分中的EF以及与其分离。服务和存储库提供了一个关注点。 – twifosp 2015-02-05 15:47:42

回答

0

如果你调用AsQueryable()IEnumerable不已经实现了IQueryable,那么整个枚举只是塞进ConstantExpression,和以往任何LINQ操作不表示为表达式树。

如果你调用AsQueryable()权的来源,那么LINQ操作用正确的查询表达式树返回IQueryable

var query = new List<Type>().AsQueryable().Where(x => x.Property == "argument");