我在我的代码中有这个查询我收到此错误。
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的错误吗?
由于
答案 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个项目。