2010-11-19 54 views
1

在下面的查詢LINQ到SQL加入和包含運營商

var restrictions = from p in dcTrad.quop_restricted_items 
          where p.entry_status == 'P' && p.batch == "PRODUCTION" && p.problem != null 
          from q in dcTrad.model_companies 
          where q.co_name != null && p.brimsec == q.primary_bsec        
          select new { Company = q.co_name, Restriction = p.comment ?? "Restricted without comments", Portfolio = p.problem }; 

我需要更換

p.brimsec == q.primary_bsec 

p.brimsec.StartsWith (q.primary_bsec ) 

,但我得到了以下錯誤:

Only arguments that can be evaluated on the client are supported for the String.StartsWith method 

我該如何做這項工作?

+0

沒有linq-to-sql沒有一個導航屬性來跟隨你的外鍵?只是好奇 – 2010-11-20 05:16:21

+0

不...這兩個表都在不同的服務器上 – bmanu 2010-11-20 06:16:56

回答

0

基本上linq to sql不知道如何將startswith轉換爲Sql。這是因爲在運行時內部,linq是將代碼生成爲sql。

您可以通過在您的linq語句中創建一個UDF(用戶定義的函數,在sql中)並使用它來實現此目的。

的文章如下: http://msdn.microsoft.com/en-us/library/bb399416.aspx

安德魯

0

我認爲你遇到的問題是linq-to-sql沒有將String.StartsWith翻譯成SQL。不過,String.Contains確實有效 - 您需要瀏覽結果集合並過濾掉不以q.primary_bsec開頭的項目。

+0

包含將工作,但我得到同樣的錯誤 – bmanu 2010-11-20 00:19:26

1

不幸的是,LINQ to SQL的翻譯是不夠聰明的把這種代碼,但有能實現相同一招:

p.brimsec.StartsWith (q.primary_bsec ) 

轉換爲:

p.brimsec.SubString(0, q.primary_bsec.Length) == q.primary_bsec 

LINQ to SQL翻譯器可以很好地處理此問題,並且語義相當於StartsWith。

坦率地說,我不明白爲什麼將StartsWith正確地轉換爲服務器端參數非常困難,以至於LINQ開發人員只是決定拋出一個錯誤。