无法将xml数据类型选为DISTINCT,因为它不具有可比性错误

时间:2012-02-23 19:10:53

标签: asp.net asp.net-mvc linq asp.net-mvc-3 linq-to-sql

我在我的代码中有这个查询我收到此错误。

 var auditMandate = (from ae in genDB.AuditEvent
                     join at in genDB.AuditTable on // snip
                     select ae)
                     .OrderByDescending(x => 
                         x.DateTime_Updated).Take(500)
                     .Distinct().ToList();
  

执行命令定义时发生错误。有关详细信息,请参阅内部异常   无法将xml数据类型选为DISTINCT,因为它不具有可比性。无法将xml数据类型选为DISTINCT,因为它无法比较。

这是我在做这个Linq的错误吗?

由于

2 个答案:

答案 0 :(得分:1)

这是可行的。采取您的查询,但摆脱不同的电话。你仍然想要一个具体的列表,所以保持ToList()。然后遵循这个想法(因为我不知道你的xml结构):

我的表

CREATE TABLE [dbo].[XmlTable](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [data] [xml] NULL
)

我的数据

insert into XmlTable
values('<list id=''a''><items></items></list>')
insert into XmlTable
values('<list id=''b''><items></items></list>')
insert into XmlTable
values('<list id=''a''><items></items></list>')

我的比较者

    public class MyXDocumentCoparer : IEqualityComparer<XDocument>
    {
        public bool Equals(XDocument x, XDocument y)
        {
            var xId = x.Root.Attribute("id").Value;
            var yId = y.Root.Attribute("id").Value;
            return xId == yId;
        }

        public int GetHashCode(XDocument obj)
        {
            var id = obj.Root.Attribute("id").Value;
            return id.GetHashCode();
        }
    }

我的代码

    using (var ctx = new xmltestEntities())
    {
        // this would be your concrete list
        var rawData = ctx.XmlTables.ToArray();

        var processedData = rawData
            .Select(row => XDocument.Parse(row.data))
            .Distinct(new MyXDocumentCoparer());

        // you'll only get two, boom!
        foreach (var item in processedData)
            Console.WriteLine(item.Root.Attribute("id"));

        Console.ReadLine();
    }

答案 1 :(得分:0)

您正在尝试选择不同的AuditEvents,但您的LINQ提供程序不知道如何确定两个AuditEvent是否相同。考虑投射到知道如何进行这种比较的类中。另一种选择是使用GroupBy根据特定属性生成不同的项目:

.GroupBy(ae => ae.Id).Select(g => g.First());

作为旁注,在致电Take之前进行明确检查通常更有意义,因此即使原始集中的前500个项目包含重复项,您仍然可以获得最多500个项目。