2010-12-14 72 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返回一行。

我已经阅读了不同的应该与匿名类型,匹配每个属性。更奇怪的是,不同的确会做某些事情,它按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] 
+1

你是否看过Sql选项卡以确切地查看SQL发送到服务器的内容?这可能有助于调试。 – 2010-12-14 16:43:18

+0

是的,我试过了,但结果并不是很有用。我编辑了我的问题以显示SQL选项卡中的内容。 – Gimly 2010-12-14 16:57:11

回答

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 {}是对象类型不是值类型。请尝试使用group by。

+0

当然你也可以使用这个重载:http://msdn.microsoft.com/en-us/library/bb338049.aspx – 2010-12-14 16:50:34

+0

这是一个好主意,但它不适用于Group By。如果我尝试,我得到一个异常,说“方法”System.Text.RegularExpressions.Match匹配(System.String,System.String)“没有支持转换为SQL”...他不知道该怎么做正则表达式。 – Gimly 2010-12-14 17:03:21

+0

好吧,没关系,我找到了一个工作方式,我创建了一个内部查询并调用了ToList(),然后执行Group By。完美的作品!谢谢 ! – Gimly 2010-12-14 17:08:41

0

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

+0

LINQ to SQL(或LINQ to Entities)不支持“Distinct”的重载,因此:https://msdn.microsoft.com/en-us/library/bb738550(v=vs.110).aspx )。 – 2017-01-10 12:31:14