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 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;
}
4

3 に答える 3

0

一般に、フィルタ条件は SQL クエリのデータ層に適用されます。

あなたが引用したコードフラグメント...テーブル全体を取得するようにクエリの早期実行を強制するように見えるもの...クライアントクエリが選択または展開を実行する場合にのみ機能するようです。クエリに select または expand が表示されません。あなたの場合、Breeze.WebAPI がこの特定のコード パスに従っていると思う理由は何ですか? 「AllCustomers」Web API メソッドの実装について何かを私たちに伝えることを怠っていませんか?

于 2013-08-27T07:34:11.173 に答える
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);

プロファイラーで確認できるように、適切な 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);

予想どおり、クエリはDBに到達しません。さらに調査できるように、問題を再現する小さなサンプルを提供していただけますか?

于 2013-09-13T19:01:27.160 に答える