BreezeJS不在数据库中执行过滤?

时间:2013-08-26 20:35:31

标签: entity-framework asp.net-web-api odata breeze

我在客户端上使用以下查询:

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

会产生以下网址: /breeze/myAPI/AllCustomers?$filter=CustomerId%20eq%2012

我注意到数据库中没有执行过滤(数据库执行的SQL中没有WHERE statemenet)。我怀疑,原因是Breeze.WebApi.QueryHelper.WrapResult,调用Enumerable.ToList。后者将IQueriable转换为强制执行查询的列表,如果默认情况下已过滤Microsoft 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);

这是Breeze中的错误还是我做错了什么?

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

更新:我使用WebAPI和控制器方法非常简单:

[BreezeController]
public class MyController : ApiController
{

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

3 个答案:

答案 0 :(得分:0)

通常,过滤条件将应用于SQL查询中的数据层。

您引用的代码片段......看起来强制过早执行查询以便它检索整个表格的代码片段......只有在您的客户端查询执行选择或扩展时才会发挥作用。我没有在您的查询中看到选择或扩展。是什么让你觉得Breeze.WebAPI在你的情况下遵循这个特定的代码路径?您是否忽略了一些关于您实施“AllCustomers”Web API方法的信息?

答案 1 :(得分:0)

马特拉,

我们无法重现此问题。

如果我执行有效的查询:

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

正如我在Profiler中看到的那样创建了正确的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);

查询甚至没有像预期的那样进入数据库。 你能提供一个重现问题的小样本,我们可以进一步调查吗?

答案 2 :(得分:0)

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

请注意,此问题仅发生在针对涉及服务器上的“命名查询”的查询的错误构造的过滤器上,并且客户端没有查询资源的entityType / resource name映射。在Breeze客户端具有entityType / resourceName映射的情况下,任何无效的过滤器在转到服务器之前都会抛出客户端错误。

和...感谢报道。 :)