3

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

これが私が作ろうとしているクエリです:

(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が匿名タイプで機能し、各プロパティに一致する必要があることを読みました。さらに奇妙なことに、distinctは実際に何かを実行し、FamilyCode(次にProductPrefixなど)のアルファベット順に値を並べ替えます。

なぜこれが機能しないのか誰かが考えていますか?ありがとう

LinqPadのSQLタブに表示されるものは次のとおりです。

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]
4

2 に答える 2

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;

を使用する場合、オブジェクトタイプは値タイプではDistinct()ないため、値ではなく、各オブジェクトへのポインタによって区別されます。select new {}代わりにgroupbyを使用してみてください。

于 2010-12-14T16:46:10.133 に答える
0

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

于 2010-12-14T17:27:18.517 に答える