2013-08-26 19 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