实体框架4通过WCF实现LINQ到实体查询

时间:2011-01-11 11:19:31

标签: .net wcf .net-4.0 entity-framework-4 linq-to-entities

我需要创建一个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(表达式)

或者将表达式作为字符串发送:

  • QueryCars(字符串表达式)

开发人员如何解决灵活查询的问题?

我目前在.NET 4.0中工作。安全性并不是真正的问题,因为这只是一个内部应用程序。

2 个答案:

答案 0 :(得分:3)

根据您的描述,您不需要纯WCF服务,而是需要WCF Data Services。数据服务允许您exposing IQueryable并在客户端上定义Linq查询。

答案 1 :(得分:3)

您正在寻找的是WCF Data Services。它使用OData协议使用Linq查询数据。

Stack Overflow OData service的示例:

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服务,或者在VS项目中添加对服务URL的引用。