0

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

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

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

我注意到在数据库中没有执行过滤(数据库执行的 SQL 中没有 WHERE 语句)。我怀疑,这样做的原因是Breeze.WebApi.QueryHelper.WrapResult,它调用Enumerable.ToList. 后者将 IQueriable 转换为列表,在默认情况下 Microsoft OData 实现过滤 if 之前强制执行查询:

// 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 提供程序。

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

[BreezeController]
public class MyController : ApiController
{

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

3 回答 3

0

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

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

并且...感谢您的报告。:)

于 2013-10-04T21:49:50.293 回答
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);

正如预期的那样,查询甚至没有进入数据库。您能否提供一个重现该问题的小样本,以便我们进一步调查?

于 2013-09-13T19:01:27.160 回答
0

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

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

于 2013-08-27T07:34:11.173 回答