Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 实体框架4基于WCF的LINQ到实体查询_.net_Wcf_.net 4.0_Entity Framework 4_Linq To Entities - Fatal编程技术网

.net 实体框架4基于WCF的LINQ到实体查询

.net 实体框架4基于WCF的LINQ到实体查询,.net,wcf,.net-4.0,entity-framework-4,linq-to-entities,.net,Wcf,.net 4.0,Entity Framework 4,Linq To Entities,我需要创建一个WCF服务来返回通过实体框架从数据库查询的对象。我读过的大多数文章都建议我应该为每种类型的查询创建一个方法。但我认为这将导致我将创建的方法数量激增,例如: GetAllCars() GetCarsByBrand(字符串品牌名) GetCarsByEAR(整数年) GetCarsByBrandYear(字符串品牌名,整数年) GetCarsByResize(浮动轮胎尺寸) GetCarsByEngineType(字符串引擎类型) GetCarsByEnginizeAndType(浮

我需要创建一个WCF服务来返回通过实体框架从数据库查询的对象。我读过的大多数文章都建议我应该为每种类型的查询创建一个方法。但我认为这将导致我将创建的方法数量激增,例如:

  • GetAllCars()
  • GetCarsByBrand(字符串品牌名)
  • GetCarsByEAR(整数年)
  • GetCarsByBrandYear(字符串品牌名,整数年)
  • GetCarsByResize(浮动轮胎尺寸)
  • GetCarsByEngineType(字符串引擎类型)
  • GetCarsByEnginizeAndType(浮点引擎大小、字符串引擎类型)
  • GetCarsByEngineseZebetween(浮动下限发动机尺寸,浮动上限发动机尺寸)
  • 等等
最重要的是,如果需要一个新的查询,那么我必须创建一个新方法来支持它

必须有更好更通用的方法来实现这一点。理想的情况是,客户端可以通过LINQ创建表达式树,通过WCF发送,然后通过实体框架运行查询。然后我可以有一个方法来支持所有查询。例如:

  • QueryCars(表达式)
或将表达式作为字符串发送:

  • QueryCars(字符串表达式)
开发人员是如何解决这个灵活查询的问题的


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

根据您的描述,您不需要纯WCF服务,而是需要。数据服务允许您在客户端上创建和定义Linq查询。

您要查找的是。它使用OData协议使用Linq查询数据

例如:

在上面的代码中,service.Users的类型为
IQueryable
,允许您使用表达式树查询它


您可以使用LINQPad轻松尝试SO服务,或者在VS项目中添加对服务URL的引用。

这似乎就是我要寻找的答案。出于好奇,在WCF数据服务出现之前,这个问题是如何解决的?在阅读了一些相关内容后,我不清楚这是否也会支持延迟加载。您知道延迟加载是否会自动处理吗?@Mas:在此之前,它被称为ADO.NET数据服务或Astoria,在此之前,Linq不存在;)@Mas:自动延迟加载服务是一个非常糟糕的主意。您可以使用特殊的扩展方法Expand on collections或调用LoadProperty。我同意,在这种情况下,延迟加载是个坏主意。
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);
}