【问题标题】:Linq distinct not working correctlyLinq distinct 无法正常工作
【发布时间】:2010-12-14 16:40:41
【问题描述】:

我在使用 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 不想工作,它为所有匹配返回一行。

我已经读过 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]

【问题讨论】:

  • 您是否查看过 Sql 选项卡以确切了解正在发送到服务器的 SQL 是什么?这可能有助于调试。
  • 是的,我试过了,但结果并不是真的有用。我已经编辑了我的问题以显示 SQL 选项卡中的内容。

标签: c# linq linqpad


【解决方案1】:
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。

【讨论】:

  • 当然你也可以使用这个重载:msdn.microsoft.com/en-us/library/bb338049.aspx
  • 这是个好主意,但它不适用于 Group By。如果我尝试,我会得到一个异常,上面写着“方法'System.Text.RegularExpressions.Match Match(System.String, System.String)' 不支持对 SQL 的翻译”......他不知道该怎么办正则表达式。
  • 好吧,没关系,我找到了一个workarond,我创建了一个内部查询并在其上调用ToList(),然后执行Group By。完美运行!谢谢!
【解决方案2】:

另一方面,您可以使用.Distinct(IEqualityComparer<T>) 重载并为您要处理的对象提供EqualityComparer。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2022-01-05
  • 2016-12-01
  • 1970-01-01
  • 2020-09-27
相关资源
最近更新 更多