2016-04-24 24 views
6

我將很快開始在xamarin上工作,並將從android studio的java向c#轉移大量代碼。linq如何執行代碼以從數據源中檢索數據?

在java中我使用的是給定參數條件等的自定義類,將它們轉換爲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' 

並將結果加載到對象?提前任何幫助

感謝你能提供

編輯:是的,我知道有sqlite.net它幾乎做什麼我的daos做,但可能會更好,在某些時候,我可能會轉換所有我的對象來使用它,我只需要知道知道

+0

你指的是哪一個LINQ? LINQ到對象? LINQ到EF? LINQ to SQL? –

+0

是的,dao創建列表 Cruces

回答

4

的緣故,如果我有多次訪問客戶(讓 我們說,我用4 foreach循環以後)將get_all方法是 稱爲4次?或者是第一次執行時存儲的結果?

每次枚舉枚舉時間(在你的例子使用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,並且客戶表有一百萬行,您是否真的想將所有這些內容都帶入內存,然後纔將它們過濾出來以使用一部分數據?通常情況下更好的是全面過濾查詢。

+1

因此,它要麼是在需要結果之前執行一次該過程,要麼是在每次需要結果時執行它,猜測我必須在性能和內存使用之間進行選擇,謝謝回答 – Cruces

+0

@Cruces它不是那麼容易和簡單 - 除非你不知道數據庫是做什麼的。如果您有6400萬客戶並查看kby名稱,並且服務器中的表具有名稱索引,則詢問數據庫服務器的速度可能會快於運行數組。在內存數據庫中實現自己的內存與從LINQ到Object在內存集合中運行完全不同。因此,權衡並非如你所做的那樣微不足道。最重要的是,對客戶的更新如何?你如何重新加載它們? ;) – TomTom

+0

Nah我沒有使用那個大的數據庫,大多數表沒有超過400k的條目,但我明白你的觀點,我通常在行數太多時分頁數據。當我必須搜索我知道的大小的東西時(例如我的郵政編碼表有大約100個條目並且可能永遠不會超過200個)。我通常使用這些數據的原型,如果現場加載它們會更好,因爲即使原型模式也存在一些問題。 – Cruces