Тип данных xml нельзя выбрать как DISTINCT, потому что это несопоставимая ошибка - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть этот запрос в моем коде. Я получаю эту ошибку.

 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 ]

1 голос
/ 23 февраля 2012

Это выполнимо.Возьмите запрос, который у вас есть, но избавьтесь от звонка 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();
    }
0 голосов
/ 23 февраля 2012

Вы пытаетесь выбрать разные AuditEvents, но ваш поставщик LINQ не знает, как определить, являются ли два AuditEvents одинаковыми.Рассмотрите проектирование в класс, который знает, как сделать это сравнение.Другим вариантом может быть использование GroupBy для создания элементов, которые различаются на основе определенных свойств:

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

В качестве дополнительного примечания, как правило, имеет смысл сделать отдельную проверку перед вызовом Takeтак что вы все равно получите до 500 предметов, даже если первые 500 предметов в исходном наборе содержат дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...