xml数据类型不能选择为DISTINCT,因为它是不可比较的错误



我的代码中有这个查询,我得到了这个错误。

 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,因为它不可比较。

林克是不是我做错了什么?

感谢

这是可行的。接受您的查询,但去掉Distinct调用。但是,您仍然需要一个具体的列表,所以请保留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();
    }

您试图选择不同的AuditEvent,但您的LINQ提供者不知道如何确定两个AuditEvent是否相同。考虑投影到一个知道如何进行比较的类中。另一种选择是使用GroupBy生成基于特定属性的不同项目:

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

顺便说一句,在调用Take之前进行不同的检查通常更有意义,因此即使原始集合中的前500个项目包含重复项,您仍然可以获得多达500个项目。

最新更新