2011-12-27 100 views
0

我試圖重新創建一些SQL查詢到L2E語句中。其中一個查詢的是:Linq to Entities LIKE'[A-G]%'查詢

SELECT TOP 25 itms.[StringValue] 
     ,itms.[Name] 
     ,itms.[Picture] 
    FROM [DB].[dbo].[Items] AS itms 
    WHERE itms.StringValue LIKE '[A-G]%' 

我(在這種情況下A)發出啓動char和結束char(G),我需要把所有的項目衛生組織StringValue開始與開始之間的char完。

我第一次嘗試是看是否L2E只想把它給我這個查詢:

items = from i in items 
     where i.StringValue.StartsWith("[" + refinement.Value + "]") 
     select i; 

我想這是行不通的,但它是值得一試。

+1

嘗試拼接你像條件之前建設查詢:string likeCondition =「[」+「....; >>其中i.StringValue.StratsWith(likeCondition) – Polity 2011-12-27 03:08:31

+0

@Polity:謝謝你的建議。我嘗試過,但仍然沒有。我在生成的SQL語句中看到一行,其中的起始位置是WHERE [Limit1]。[StringValue] LIKE @ p__linq__2 ESCAPE N'〜''。我在想'ESCAPE'是問題所在? – 2011-12-27 03:43:51

+0

進一步檢查時,'@ p__linq__2' ='〜[A-G]%'。那麼,我該如何避開它呢? – 2011-12-27 04:13:29

回答

1

夫婦的選擇,應該工作:

1)如果你知道過濾器正是基於第一個字符,那麼你可以這樣做:

var startChar = 'A'; 
var endChar = 'G'; 

// other options, but you get the point 
var validStartChars = Enumerable.Range(0, 26) 
    .Select(i => (char)('A' + i)) 
    .Where(c => c >= startChar && c <= endChar) 
    .ToArray(); 

var matches = items.Where(i => validStartChars.Contains(i.StringValue[0])); 

同樣,你可以取第一個字符,只是在Where子句中做更大/更小的檢查(如果它總是這樣的範圍)

2)如果你想,你仍然可以使用sql來查詢L2E,只需使用ExecuteStoreQuery並讓它將實體退還給您:

http://msdn.microsoft.com/en-us/library/dd487208.aspx

如果你想返回的實體進行跟蹤,請確保調用,讓你指定實體集名稱過載:

http://msdn.microsoft.com/en-us/library/dd487226.aspx

+0

L2E無法識別'get_char(int)',但我喜歡這個主意!L2E在'i.StringValue [0]'部分出錯。 – 2011-12-27 16:25:34

+0

啊,也許是i.StringValue.Substring(0,1)?可能需要char數組作爲字符串數組 – 2011-12-27 20:33:54

0

這應該真的有效,所以我不完全確定它爲什麼沒有。值得檢查的refinement.Value來自某個合理的地方,而不是直接另一個LINQ to SQL查詢。

除此之外,還有SQLMethods類,它提供了很多在編寫LINQ to SQL查詢時可用的SQL工具(注意它不適用於LINQ來查詢對象)。因此,您可以使用SQLMethods Like方法,併爲其提供原始的LIKE語句。

+0

謝謝,來自細化的價值是明智的(如「AG 「)。 SQLMethods不適用於L2E,因此它們不起作用:( – 2011-12-27 02:50:30