2017-11-17 12 views
0

Entity FrameworkのクエリにのIQueryableを適用するプログラム的な方法我々は、Web APIとURLからのODataクエリを受け入れることができ、それは同じくらい簡単です:ASP.NETのWeb API

[EnableQuery] 
public IQueryable<EFType> GetBuiltInTypes() 
{ 
    return db.EFTypes; 
} 

データが制限されますODataクエリとしてのデータベースがEntity Frameworkデータベースクエリに追加されます。

のは、私はそれを返す前に、データをいくつかの仕事をしたいとしましょう:

[EnableQuery] 
public IQueryable<SomePOCO> GetBuiltInTypes() 
{ 
    var dbQuery = from obj in FncCall() select obj; 

    //Do something with the data and put the result into a 
    //List<SomePOCO> 

    var list = DoSomeWork(dbQuery) //whatever 

    return list.AsQueryable(); 
} 

注:一般的なDbSetを返し、ないそれはまだ動作しますDbSet<SomeType>

をそれが制限されますFncCall()を結果とメモリ内のlistにODataクエリを適用し、dbQueryがデータベースに適用されていませんか?それを行う簡単な方法?で、Microsoftのドキュメントから

私はで動作するように持っているものとしてコンパイル時に、この場合には、Productを我々は

public IQueryable<Product> Get(ODataQueryOptions opts) { 
    var settings = new ODataValidationSettings() { 
     // Initialize settings as needed. 
     AllowedFunctions = AllowedFunctions.AllMathFunctions 
    }; 

    opts.Validate(settings); 

    IQueryable results = opts.ApplyTo(products.AsQueryable()); 
    return results as IQueryable<Product>; 
} 

を行うことができますが、私は種類を知りませんDbType

+0

まあ、 ? – 12seconds

+0

はい、問合せに追加してデータベースで行うことはできませんが、オブジェクトを別のセット・タイプのオブジェクトに変換します。 –

+0

なぜGenericバージョンを使用する必要があるのか​​まだ分かりません。 ODataライブラリのどのメソッドは、汎用バージョンのIQueryable に制限されていますか? – Igor

答えて

0

はい、ToList/ToArray/AsEnumerable /などは呼び出さないでください。 IQueryableインスタンスがデータベースを呼び出す原因となるもの。例えば

: `限り、それは` IQueryable`として、それは問題ないはずSQLに変換して戻すことが可能なものであるとして、何 `DoSomeWork()上の任意の文脈なし

[EnableQuery] 
public IQueryable<SomePOCO> GetBuiltInTypes() 
{ 
    var dbQuery = from obj in FncCall() select obj; 
    // at this point the database has not yet been called 
    IQueryable<SomePOCO> result = DoSomeWork(dbQuery); 
    return result; 
} 

private IQueryable<SomePOCO> DoSomeWork(IQueryable<SomePOCO> dbQuery) 
{ 
    // still not executed against db 
    return dbQuery.Where(x => x.something == "something"); 
} 
+0

に返信します。はい、私の問題は結果を制限してクエリを適用したいということです私はそれを使用する前にデータベースに...私の最後の編集を参照してください:) –

+0

@ PedroFigueiredo - これはまさにそれを行います。 DoSomeWorkの 'where'句は、OData変換された式が適用される前に実行される最後のクエリにも適用されます。 – Igor