2016-04-24 5 views
6

まもなくxamarinの作業を開始し、アンドロイドスタジオのjavaからC#に多くのコードを転送します。 Javaで linqは実際にデータソースからデータを取得するコードをどのように実行しますか?

は、私はSQL文に変換などの引数の条件を与えられているカスタムクラスを使用して、プロジェクトのモデルのオブジェクトに結果をロードしています

私は不明だと、天気をLINQはありますそのようなデータをフィルタリングするためのより良いオプションです。現在、何が起こるか例えば

は、これらの行

List<Customer> customers = (new CustomerDAO()).get_all() 

または私は条件を持っている場合

List<Customer> customers = (new CustomerDAO()).get(new Condition(CustomerDAO.Code, equals, "code1") 

は、今私たちは、私は、C#にクラスを転送していると仮定しますと、私がしたい沿っsomethngです後者の場合と同様にしてください。

だから私は、おそらくの線に沿って何か書きます:私は、私が実際にアクセス顧客にしようとすると、クエリにのみ実行されることを知っているが、私は顧客に複数のアクセスを持っている場合(私たちを聞かせて

var customers = from customer 
    in (new CustomerDAO()).get_all() 
    where customer.code.equals("code1") 
    select customer 

を私は後で4つのforeachループを使用します)、get_allメソッドは4回呼び出されますか?または最初の実行時に結果が格納されていますか?

また、get_all()メソッドをそのまま使用し、linqを使用して結果をフィルタリングする方が効率的です(時間的にはメモリが多いのでおそらくありません)。または、実際に実行している既存のセットアップを使用してください

Select * from Customers where code = 'code1' 

結果をオブジェクトにロードしますか?あなたは

編集を提供することができる任意の助けを事前に

ありがとう:はい、私はかなり私のDAOSが何を行いますが、おそらくより良い、といくつかの点で私はおそらくすべての私を変換しますどのsqlite.netがある知っていますオブジェクトは、それを使用するために、私はちょうど私が顧客に複数のアクセスを持っている場合

+0

どのLINQを参照していますか?オブジェクトへのLINQ? LINQ to EF? LINQ to SQL? –

+0

はい、daoがリストを作成します Cruces

答えて

4

を知るために知っておく必要がありGET_ALL方法は は4と呼ばれるだろう(私たちは、私は4 foreachの後にループを使用することを言う をしましょう)時間?または最初の実行時に結果が格納されていますか?

あなたは(あなたの例ではforeachを使用して)列挙子を列挙するたびに、クエリが再実行されます、あなたはどこかマテリアライズド結果を保存しません。たとえば、あなたがしたい最初のクエリの場合:

var customerSource = new CustomerDAO(); 
List<Customer> customerSource.Where(customer => customer.Code.Equals("code1")).ToList(); 

は、それから、今、あなたは再びクエリを超える実行せずに、メモリ内List<Customer>で作業することがあります。逆に

、あなたがしたいたび場合:

var filteredCustomers = customerSource.Where(customer => customer.Code.Equals("code1")) 
foreach (var customer in filteredCustomers) 
{ 
    // Do stuff 
} 

その後、あなたは再び上で述べたクエリをexeuctingすることがあります、各列挙について。

だけ(GET_ALLを維持するために(メモリが賢明それはおそらく ではないので、時間的に)また、)より効率的な 結果をフィルタリングするための方法および使用LINQのですか?または実際に実行している私の既存のセットアップを使用してください

それは実際にあなたのユースケースに依存します。あなたはLINQ to EFを使用していて、顧客テーブルには100万行があると想像してみましょう。本当にそれらをすべてメモリ内に持ち込み、データのサブセットを使用するためにそれらをフィルタリングしたいのですか?通常、フィルタリングされたクエリをフルにする方がよいでしょう。

+1

結果を必要とする前に一度だけproccessを実行するか、必要なときに毎回実行するかのどちらかです。メモリ使用量に対するパフォーマンスと、回答のおかげで選択する必要があります。 – Cruces

+0

@Crucesあなたがデータベースのことを知らない場合を除き、それは簡単ではありません。 6,400万人の顧客を持ち、kbyの名前を参照していて、サーバーのテーブルに名前に関するインデックスがある場合は、配列に沿って実行するよりデータベースサーバーに問い合わせる方が早いかもしれません。メモリデータベースに独自の実装を実装するのは、LINQ to Objectsをメモリ内で実行することとはまったく違う獣です。したがって、トレードオフはそれほど簡単ではありません。上に、言われた顧客への更新はどうですか?どうやってそれらをリロードするのですか? ;) – TomTom

+0

Nah私は大きなデータベースで作業していません。ほとんどのテーブルには400k以上のエントリがありませんが、ポイントがあります。通常、行が多すぎるとデータをページします。私が知っているサイズのものを検索しなければならないとき(例えば、私のポストコードテーブルは約100のエントリを持ち、おそらく200以上に達することはありません)。私は通常、そのようなデータのプロトタイプで作業していますが、プロトタイプのパターンでさえいくつかの問題があるため、現場でロードする方が良いのであれば、私はちょうどさまよっていました。 – Cruces

関連する問題