我的代码中有这个查询,我得到了这个错误。
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个项目。