2011-12-27 22 views
0

私はL2EステートメントにいくつかのSQLクエリを再作成しようとしています。クエリの一つは次のとおりです。エンティティへのLinq '[A-G]%'クエリ

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

私はスタートchar(この場合はA)と終了char(G)が与えられていると私はスタートの間charStringValue開始玉葉のすべてのアイテムを引っ張っする必要があり、完了。

私の最初の試みは、L2Eはちょうどこのクエリで私にそれを与えるかどうかを確認することでした。

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

を、私はそれが機能しないと考えましたが、それは試してみる価値がありました。

+1

は前の建物にあなたのような条件を連結してくださいクエリ:文字列likeCondition = "[" + "....; >> where i.StringValue.StratsWith(likeCondition) – Polity

+0

@Polity:提案に感謝します。私はそれを試みたが、まだ何もしなかった。私は、生成されたSQL文で、WHERE [Limit1]。[StringValue] LIKE @ p__linq__2 ESCAPE N '〜'という行が始まるところで見ています。私はESCAPEが問題だと思っていますか? –

+0

さらに検査すると、 '@p__linq__2' ='〜[A-G]% 'となります。それで、どうやってそれをエスケープするのですか? –

答えて

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])); 

を、あなたがフェッチ可能性がありあなたが望むなら、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]'部分でエラーを出しました。 –

+0

ああ、おそらくi.StringValue.Substring(0,1)?代わりにchar配列が文字列配列として必要になるでしょう –

0

これは本当にうまくいっているはずなので、なぜそれがないのか私は完全にはわかりません。 refinement.Valueは、別のLINQ to SQLクエリではなく、どこかで分かりやすいものから来ています。

さらに、SQLMethodsクラスには、LINQ to SQLクエリを書くときにSQLで利用できるたくさんの機能が用意されています(オブジェクトクエリに対するLINQでは機能しません)。したがって、SQLMethodsのようなメソッドを使用し、元のLIKEステートメントを与えることができます。

+0

おかげさまで、洗練された値は賢明です(「AG ")。 ( –