Linq отчетливо не работает - PullRequest
       3

Linq отчетливо не работает

3 голосов
/ 14 декабря 2010

У меня странная проблема с запросом linq.Я использую LINQPad 4 для создания запроса, использующего регулярное выражение с использованием LinqToSQL в качестве драйвера LinqPad.

Вот запрос, который я пытаюсь сделать:

(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 не хочет работать, он возвращает строку для всех совпадений.

Я прочитал, что отдельный должен работать с анонимным типом, соответствующим каждому свойству.Еще более странным является то, что Different действительно что-то делает, он упорядочивает значения в алфавитном порядке по FamilyCode (а затем по ProductPrefix и т. Д.).

Кто-то знает, почему это не работает?Спасибо

Вот что отображается на вкладке SQL в LinqPad:

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]

Ответы [ 2 ]

3 голосов
/ 14 декабря 2010
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 {} является типом объекта, а не типом значения.Попробуйте вместо этого использовать group by.

0 голосов
/ 14 декабря 2010

С другой стороны, вы можете использовать перегрузку .Distinct(IEqualityComparer<T>) и предоставить EqualityComparer для объекта, который вы хотите обработать.

...