2013-05-08 66 views
1

通配符在LINQ to SQL中我試圖尋找雙類型的值:LINQ到SQL搜索雙

var q = from a in db.GetTable<HKKS_Medlemmer>() 
      from g in db.HKKS_Get_grader_Kun_Grad(Convert.ToInt32(a.Skif)) 
      where a.Aktiv == true && 
      (a.Skif.ToString().StartsWith(SearchValue) || 
      SqlMethods.Like(a.Navn, "%" + SearchValue + "%") || 
       SqlMethods.Like(a.Mellemnavn, "%" + SearchValue + "%") || 
       SqlMethods.Like(a.Efternavn, "%" + SearchValue + "%") || 
       SqlMethods.Like(a.Adresse, "%" + SearchValue + "%") || 
       SqlMethods.Like(a.Telefon, "%" + SearchValue + "%") || 
       SqlMethods.Like(a.Mobil, "%" + SearchValue + "%") || 
       SqlMethods.Like(a.PostNr, "%" + SearchValue + "%") || 
       SqlMethods.Like(a.town, "%" + SearchValue + "%") || 
       SqlMethods.Like(a.mail, "%" + SearchValue + "%")) 
      orderby a.Navn 
select new 
      { 
       Grad = g.Grad, 
       Skif = a.Skif, 
       Navn = a.Navn, 
       Mellemnavn = a.Mellemnavn, 
       Efternavn = a.Efternavn, 
       Adresse = a.Adresse, 
       Telefon = a.Telefon, 
       Mobil = a.Mobil, 
       PostNr = a.PostNr, 
       town = a.town, 
       mail = a.mail, 
       Picture = "http://www.hkks.dk/" + a.Picture, 
       Age = db.fn_GetAge((a.CPR), DateTime.Now), 
       Cpr = a.CPR 

      }; 

我也試過這樣:

var u = from a in db.GetTable<HKKS_Medlemmer>() 
       from g in db.HKKS_Get_grader_Kun_Grad(Convert.ToInt32(a.Skif)) 
       .Where (p => Object.Equals(a.Skif, SearchValue)) 
       orderby a.Navn 
       select new 
       { 
        Grad = g.Grad, 
        Skif = a.Skif, 
        Navn = a.Navn, 
        Mellemnavn = a.Mellemnavn, 
        Efternavn = a.Efternavn, 
        Adresse = a.Adresse, 
        Telefon = a.Telefon, 
        Mobil = a.Mobil, 
        PostNr = a.PostNr, 
        town = a.town, 
        mail = a.mail, 
        Picture = "http://www.hkks.dk/" + a.Picture, 
        Age = db.fn_GetAge((a.CPR), DateTime.Now), 
        Cpr = a.CPR 

       }; 

但沒有人給我正確的結果,如果我正在尋找994並期望結果給我99469的記錄。

有什麼建議嗎?

+1

哪個字段是雙?你不能只是先把它轉換成一個字符串,然後對它做一個'LIKE'? – rsbarro 2013-05-08 14:06:09

+0

a.Skif是雙。 .StartsWith實際上生成一個LIKE [994%],但是轉換ToString()生成一個(CONVERT(NVARCHAR(30),[t0]。[Skif],2)LIKE @ p11) – 2013-05-08 14:44:47

回答

0

從您的評論的.StartsWith方法生成的SQL語句:

(CONVERT(NVARCHAR(30), [t0].[Skif], 2) LIKE @p11) 

您可以使用下面的SQL來說明這個問題:

DECLARE @val AS FLOAT 
SET @val = 99469 
SELECT CONVERT(NVARCHAR(30), @val, 2) 

如果運行SQL,你會看到輸出是一個絕對不以「994」開頭的字符串:

9.946900000000000e+004 

爲99469轉換爲字符串,而無需使用e+符號,你可以重寫這樣的說法:

Convert.ToInt32(a.Skif).ToString().StartsWith(SearchValue) 

這將生成的SQL語句,這應該解決的問題:

WHERE (CONVERT(NVarChar,CONVERT(Int,[t0].[Skif]))) LIKE @p11 

這將是很好,如果你可以只聲明是這樣的:

a.Skif.ToString("####").StartsWith(SearchValue) 

.ToString()方法不支持在LINQ到SQL(當我嘗試時,我收到了一條Method 'System.String ToString(System.String)' has no supported translation to SQL.錯誤消息)。

此外,還可能有其他解決方法。使用EF4時,可能會有一些內容在SqlFunctions中,允許您一步完成轉換,而無需轉換爲INT(如果需要,也可以使用BIGINT)。實際上,所有LINQ to SQL需要做的是生成一個0作爲最後一個參數,而不是2(即CONVERT(NVARCHAR(30), @val, 0))的語句。

希望有所幫助。