使用Entity Framework 4通过WCF进行LINQ to Entities查询

3
我需要创建一个WCF服务,通过Entity Framework从数据库中查询对象并返回。大多数我阅读的文章都建议我为每种类型的查询创建一个方法。但我认为这将导致我创建的方法数量爆炸,例如:
- GetAllCars() - GetCarsByBrand(string brandName) - GetCarsByYear(int year) - GetCarsByBrandAndYear(string brandName, int year) - GetCarsByTireSize(float tireSize) - GetCarsByEngineType(string engineType) - GetCarsByEngineSizeAndType(float engineSize, string engineType) - GetCarsByEngineSizeBetween(float lowerEngineSize, float upperEngineSize) - 等等...
此外,如果需要新的查询,则必须创建一个新的方法来支持它。
一定有更好、更通用的方法来解决这个问题。理想情况下,客户端可以通过LINQ创建一个表达式树,将其发送到WCF,然后通过实体框架运行查询。那么我就可以有一个方法来支持所有查询。例如:
- QueryCars(Expression expression)
或者将表达式作为字符串发送:
- QueryCars(string expression)
开发人员是如何解决这个灵活查询的问题的?
我目前正在使用.NET 4.0进行工作。安全性并不是真正的问题,因为这只是一个内部应用程序。
2个回答

3
你需要的是WCF数据服务。它使用OData协议和Linq查询数据。
Stack Overflow OData服务为例:
var query = from u in service.Users
            orderby u.Reputation descending
            select u;

Console.WriteLine ("Top ten Stack Overflow users");
foreach (var u in query.Take(10))
{
    Console.WriteLine ("{0}: {1}", u.DisplayName, u.Reputation);
}

在上面的代码中,service.Users 的类型为 IQueryable<User>,这使您可以使用表达式树查询它。
您可以轻松地使用 LINQPad 尝试 SO 服务,或通过将服务 URL 引用添加到 VS 项目中来尝试。

这看起来就是我要找的答案。出于好奇,在 WCF 数据服务之前,这个问题会怎么解决? - Mas
阅读了一些相关内容后,我不确定它是否也支持延迟加载。你知道是否自动处理延迟加载吗? - Mas
@Mas:在此之前,它被称为ADO.NET数据服务或Astoria,在此之前Linq不存在 ;) - Ladislav Mrnka
2
@Mas:自动懒加载服务是一个非常糟糕的想法。你可以使用集合上的特殊扩展方法Expand或调用LoadProperty。 - Ladislav Mrnka
我看了一个例子,发现相关的对象必须从数据库中显式加载。我同意,在这种情况下懒加载是个坏主意。 - Mas
OData链接已损坏。 - Cœur

3

根据您的描述,您不需要纯WCF服务,而是需要使用WCF数据服务。数据服务允许您公开IQueryable并在客户端定义Linq查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接