2013-08-26 28 views
0

我在客户端使用以下查询:BreezeJS不执行数据库中的过滤?

var query = breeze.EntityQuery.from("AllCustomers").where("CustomerId,"==",criteriaValue); 
return this.manager.executeQuery(query) 

导致以下网址: /breeze/myAPI/AllCustomers?$filter=CustomerId%20eq%2012

我注意到,过滤未在数据库中执行的(没有WHERE statemenet在由数据库执行的SQL中)。我怀疑,原因是Breeze.WebApi.QueryHelper.WrapResult,其中调用Enumerable.ToList。后来皈依IQueriable列出其是否是默认微软的OData实现过滤之前强制执行查询:

// if a select or expand was encountered we need to 
// execute the DbQueries here, so that any exceptions thrown can be properly returned. 
// if we wait to have the query executed within the serializer, some exceptions will not 
// serialize properly. 
queryResult = Enumerable.ToList((dynamic)queryResult); 
queryResult = PostExecuteQuery((IEnumerable)queryResult); 

这是在微风中的错误还是我做错了什么?

我正在使用Oracle ODP.NET提供程序实体框架。

UPDATE:我使用的WebAPI和控制器方法非常简单:

[BreezeController] 
public class MyController : ApiController 
{ 

[HttpGet] 
public IQueryable<Customer> AllCustomers() 
{    
    return _contextProvider.Context.Customers; 
} 

回答

0

好吧,这是一个错误,并已修复。该修复程序将在我们的下一个完整测试版本(v 1.4.3)中提供,或者您现在可以从Breeze Git存储库获取我们当前的开发版本。

请注意,此问题只发生在针对涉及服务器上的“命名查询”的查询构建的过滤器错误且客户端没有查询资源的实体类型/资源名称映射的情况下。在Breeze客户端有一个entityType/resourceName映射的情况下,任何无效的过滤器在进入服务器之前都会抛出客户端错误。

...感谢报告。:)

+0

谢谢。修复的承诺是什么? https://github.com/IdeaBlade/Breeze/commit/c94b20d5141c72b8295b179b93638a70670133f6? – matra

+0

只要采取最新的措施,我们会尽力确保它始终保持清洁。请注意,在我们发布之前它仍将标记为1.4.2。 –

+0

我明白这一点。我只是好奇,修补程序是什么,因为我无法自己修复它:-) – matra

0

一般而言过滤标准将在SQL查询数据层施加。

您引用的代码片段...似乎强制过早执行查询以使其检索整个表......似乎仅在您的客户端查询执行选择或扩大。我在查询中看不到选择或展开。是什么让你认为Breeze.WebAPI在你的案例中遵循这个特定的代码路径?你是否忽略了告诉我们关于你的“AllCustomers”Web API方法的实现?

+0

因为我用调试器将它跟踪到这个位置。它从BreezeQueryableAttribute.OnActionExecuted调用。 – matra

+0

我想我还不够清楚。如代码清楚地表明的那样,它认为您正在执行选择或扩展,这在客户请求中不明显。而且,Breeze会将查询过滤条件添加到执行查询的查询中。您正在描述我们在正确形成的服务器方法中从未见过的行为。我们真的需要看到控制器类定义(Web API,对吗?您可以省略“AllCustomers”以外的方法),“AllCustomers”方法包括其属性,以及该方法和返回数据上下文之间的任何代码。 – Ward

+0

在简化场景中尝试重现问题时,我发现如果筛选器包含无效字段名称,则会执行未筛选的SQL。在这种情况下,选择整个表格,转换ToList(),然后返回HTTP 400错误请求。即使过滤器包含有效的字段名称,也会执行有问题的WrapResult方法代码fragement,但在此情况下,WrapResult方法的queryResult参数中传递的ObjectQuery正确包含WHERE表达式。所以,Breeze不应该为无效请求调用ToList。 – matra

0

马特拉,

我们无法重现此问题。

如果我执行一个有效的查询:

var query = new breeze.EntityQuery() 
     .from("Employees") 
     .where("employeeID","==", 1); 

创建正确的SQL,我可以在探查见:

exec sp_executesql N'SELECT 
[Extent1].[EmployeeID] AS [EmployeeID], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[Title] AS [Title], 
[Extent1].[TitleOfCourtesy] AS [TitleOfCourtesy], 
[Extent1].[BirthDate] AS [BirthDate], 
[Extent1].[HireDate] AS [HireDate], 
[Extent1].[Address] AS [Address], 
[Extent1].[City] AS [City], 
[Extent1].[Region] AS [Region], 
[Extent1].[PostalCode] AS [PostalCode], 
[Extent1].[Country] AS [Country], 
[Extent1].[HomePhone] AS [HomePhone], 
[Extent1].[Extension] AS [Extension], 
[Extent1].[Photo] AS [Photo], 
[Extent1].[Notes] AS [Notes], 
[Extent1].[PhotoPath] AS [PhotoPath], 
[Extent1].[ReportsToEmployeeID] AS [ReportsToEmployeeID], 
[Extent1].[RowVersion] AS [RowVersion], 
[Extent1].[FullName] AS [FullName] 
FROM [dbo].[Employee] AS [Extent1] 
WHERE [Extent1].[EmployeeID] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=1 

但是,如果我执行与无效字段的查询:

var query = new breeze.EntityQuery() 
     .from("Employees") 
     .where("invalidEmployeeID","==", 1); 

查询甚至没有按照预期将它交给数据库。 您能否提供一个能够再现问题的小样本,以便我们进一步调查?

+0

我正在使用一个相当不标准的设置:Oracle实体框架提供程序与跟踪提供程序链接,因此可能很难提供小样本。我可以看到跟踪提供程序记录查询执行的开始和结束(没有WHERE部分)。当数据库被击中时,调用堆栈如下所示:'Breeze.WebApi.QueryHelper.WrapResult(..)Line 231,Breeze.WebApi.dll!Breeze.WebApi.BreezeQueryableAttribute.OnActionExecuted(..)Line 88'。有问题的行是'queryResult = Enumerable.ToList((dynamic)queryResult)'。在测试过程中你是否击中了这条线? – matra