2010-12-14 62 views
3

linqクエリで奇妙な問題が発生しています。 LinqPad 4を使用してLinqToSQLをLinqPadドライバとして使用する正規表現を使用するクエリを作成しています。ここでLinqが正しく動作しない

は私が作るしようとしているクエリです:

(from match in 
from s in SystemErrors 
select Regex.Match(s.Description, "...") 
select new 
{ 
    FamilyCode = match.Groups["FamilyCode"].Value, 
    ProductPrefix = match.Groups["ProductPrefix"].Value, 
    BillingGroup = match.Groups["BillingGroup"].Value, 
    Debtor = match.Groups["Debtor"].Value 
}).Distinct() 

あなたは私がグループを使用して、ログテーブルのテキスト記述からデータを抽出しようとして見ることができるように。クエリは機能しますが、Distinctは動作したくないので、すべてのMatchの行を返します。

私は、それぞれのプロパティに一致する匿名タイプで動作するはずです。もっと奇妙なのは、distinctが実際に何かをしていることです。それは、FamilyCode(そしてProductPrefixなど)によってアルファベット順に値を並べ替えます。

なぜこれが機能しないのか考えている人はいますか?ここで おかげ

がLinqPadのSQL]タブに表示されているものです:あなたはDistinct()を使用する場合

DECLARE @p0 NVarChar(1000) = 'Big Regexp' 
DECLARE @p1 NVarChar(1000) = 'FamilyCode' 
DECLARE @p2 NVarChar(1000) = 'ProductPrefix' 
DECLARE @p3 NVarChar(1000) = 'BillingGroup' 
DECLARE @p4 NVarChar(1000) = 'Debtor' 

SELECT DISTINCT [t2].[Description] AS [input], [t2].[value], [t2].[value2], [t2].[value3], [t2].[value4], [t2].[value5] 
FROM (
    SELECT [t1].[Description], [t1].[value], @p1 AS [value2], @p2 AS [value3], @p3 AS [value4], @p4 AS [value5] 
    FROM (
     SELECT [t0].[Description], @p0 AS [value] 
     FROM [SystemError] AS [t0] 
     ) AS [t1] 
    ) AS [t2] 
+1

[Sql]タブを見て、どのSQLがサーバーに送信されているのかを確認しましたか?それはデバッグに役立つかもしれません。 –

+0

はい、私は試しましたが、結果は本当に有用ではありません。私は私の質問を編集して、SQLタブにあるものを表示しました。 – Gimly

答えて

3
var result = from eachError in SystemErrors 
      let match = Regex.Match(eachError.Description, "...") 
      group eachError by new 
      { 
       FamilyCode = match.Groups["FamilyCode"].Value, 
       ProductPrefix = match.Groups["ProductPrefix"].Value, 
       BillingGroup = match.Groups["BillingGroup"].Value, 
       Debtor = match.Groups["Debtor"].Value 
      } 
      into unique 
      select unique.key; 

select new {}がオブジェクト型ではない値であるので、それはそれぞれのオブジェクトではなく、値へのポインタによって明瞭ですタイプ。代わりにgroup byを使用してみてください。

+0

もちろん、このオーバーロードを使用することもできます:http://msdn.microsoft.com/en-us/library/bb338049.aspx –

+0

良いアイデアでしたが、Group Byでは動作しません。私が試してみると、 "Method 'System.Text.RegularExpressions.Match Match(System.String、System.String)'にはSQLへのサポートされている変換がありません"という例外が表示されます。 "...彼は何をするべきかわかりません正規表現 – Gimly

+0

OK、nevermind私はworkarondを見つけました。内側のクエリを作成し、ToList()を呼び出してからGroup Byを実行します。完璧に動作します!ありがとう! – Gimly

0

一方、.Distinct(IEqualityComparer<T>)オーバーロードを使用して、処理するオブジェクトに対してEqualityComparerを提供することができます。

+0

「Distinct」のオーバーロードは、LINQ to SQL(LINQ to Entities)ではサポートされていません。https://msdn.microsoft.com/en-us/library/bb738550(v=vs.110).aspx )。 –

関連する問題