2012-11-09 51 views
1

我一直在使用第三方DAL(SubSonic)爲所有數據庫對象生成類的項目。表達式語法單字段

用於查詢這些對象,將現有代碼的做法已普遍:

int keyValue = 1; 
TableObject t = TableObject.SingleOrDefault(x => (x.keyField == keyValue)); 
if (t != null) { 
    int valueWeWant = t.fieldWeWant; 
    string otherValueWeWant = t.otherFieldWeWant; 
} 

我一直一般設法降低SQL流量儘可能的,因爲我們往往有較大的行和經常只涉及一個或兩個領域。到目前爲止,我已經能夠找到最好的辦法是:

int keyValue = 1; 
var t = TableObject.All().Where(x => (x.keyField == keyValue)).Select(x => new { x.fieldWeWant, x.otherFieldWeWant}).Take(1); 
if ((t != null) && (t.Count() != 0)) { 
    int valueWeWant = t.First().fieldWeWant; 
    string otherValueWeWant = t.First().otherFieldWeWant; 
} 

我喜歡生成的SQL只選擇單個行和2場,並且很高興與匿名類型的可讀性,但有比較.Count()對我來說似乎很浪費。

我錯過了一個更簡單的方法來執行此操作嗎?

+2

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

3

如果用SingleOrDefault()替換Take(1),你需要檢查只針對null,不爲Count() == 1,並跳過的First()電話:

var t = TableObject 
    .All() 
    .Where(x => (x.keyField == keyValue)) 
    .Select(x => new { x.fieldWeWant, x.otherFieldWeWant}) 
    .SingleOrDefault(); 
if (t != null) { 
    int valueWeWant = t.fieldWeWant; 
    string otherValueWeWant = t.otherFieldWeWant; 
} 
+0

謝謝,這是完美的(等到我讓我接受)! – DaveD

0

你有正確的想法,但如果你發現yourslef使用COUNT()> 0,你將要使用

if ((t != null) && (t.Any())) 

。任何()返回true,一旦發現集合中的第一個實體。然而,.Count中()遍歷整個集合返回true之前,是一個性能命中

+0

非常高興知道,但因爲我在做。在查詢中拿(1)這個答案不是嚴格的這個問題的好答案。 – DaveD

+0

@Dave ....是的,你是對的。我錯過了。 – MikeTWebb