2008-09-27 219 views
2

我今天開始和Linq玩耍,遇到了一個我找不到答案的問題。我正在查詢有一些員工記錄的簡單SQL Server數據庫。其中一個字段是全名(cn)。我認爲在第一個空間中將全名分組,將名字分組會很有趣。我試過LINQ group by question

group by person.cn.Split(separators)[0] 

但是遇到了一個冗長的運行時異常(看起來很像C++模板實例化錯誤)。

然後我試圖通過名字的幾個字母分組:

group by person.cn.Substring(0,5) 

,並且工作得很好,但不是我想要的。

我想知道兩件事:

  • 爲什麼第一個例子不是當它看起來如此接近的第二工作嗎?
  • 因爲知道幕後是SQL的東西怎麼回事,什麼是應該做這種事情有效

感謝一個很好的方式,

安德魯

+0

您可以加入異常消息?當你得到一個時,這很重要。 – 2008-09-27 05:44:13

回答

2

斯普利特沒有翻譯成SQL。

那麼,如何做到這一點沒有拆分字符串操作?金手指像地獄(未經測試):

string oneSpace = " "; 
string fiftySpace = "             "; 

var query = 
    from person in db.Persons 
    let lastname = person.cn.Replace(oneSpace, fiftySpace).SubString(0, 50).Trim() 
    group person by lastname into g 
    select new { Key = g.Key, Count = g.Count }; 
1

的原因,你的第一次嘗試沒有成功是因爲LINQ to SQL中使用表達式樹來翻譯您的查詢的SQL。因此,任何不能直接轉換成SQL的代碼都是例外 - 這包括對Split的調用。

1

感謝球員,我會嘗試「替換」技巧,看看是否運行。我對LINQ非常感興趣,但是現在看起來有一些隱藏的神祕之處,在能夠有效地使用它之前,您必須知道LINQ查詢翻譯成什麼。

核心問題當然是我不太瞭解SQL,所以這就是我要開始的地方。

編輯:

我終於嘗試了「替換」今天,它的工作原理。我甚至需要通過計數來對分組結果進行排序,所以現在我在公司中有一個名字。儘管如此,它速度非常緩慢。選擇所有內容並直接在C#中執行分組速度要快得多。

再次感謝,

安德魯

+0

真的,你只需要知道什麼.NET方法可以轉換爲SQL - 你並不需要知道它的翻譯方式。雖然它是有幫助的。 =) – 2008-09-27 19:26:33