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

时间:2011-09-18 12:45:06

标签: linq linq-to-sql entity-framework-4 linq-to-entities

在我的代码中,我有以下Linq查询:

IQueryable<Data> charts = (from report in ctx.Charts group report by new 
    { 
        Name = report.ChartTitle.ChartType.ChartCategory.CategoryName,
        id = report.ChartTitle.ChartType.ChartCategory.ChartCategoryId, 
        Period = report.Period 
    } into d
    select new Data
    {
        Name = d.Key.Name,
        Id = d.Key.id,
        Period = d.Key.Period,            
        Reports = from r in d group r by new 
        { Title = r.ChartTitle.Name, id = r.ChartTitle.ChartTitleId } into rs
        select new Report
        {
            Title = rs.Key.Title,
            Id = rs.Key.id,
            Charts = (from c in rs group c by new 
                    { 
                        ChartId = c.ChartId, 
                        FiscalYear = c.FiscalYear, 
                        ModifiedDate = c.ChartView.ModifiedDate, 
                        Function = c.Function.DisplayName, 
                        ChartData=c.ChartView.ViewData
                    } into cs
                    select new ChartInfo 
                    { 
                        ChartId = cs.Key.ChartId, 
                        FiscalYear = cs.Key.FiscalYear,
                        ModifiedDate = cs.Key.ModifiedDate, 
                        Function = cs.Key.Function, 
                        ChartData=cs.Key.ChartData 
                    })
    }});

在上面的代码中,如果我排除“ChartData”字段(XML数据类型),则查询执行正常。但是当我包含此字段时,它会抛出以下错误:“xml数据类型不能被选为DISTINCT,因为它不具有可比性。”

让我知道我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

您没有告诉我们ChartData的实际数据类型是什么,但是从您描述的错误看起来问题是,无论此数据类型是什么,它都不会实现IComparable接口,这是必需的接口,如果您希望数据类型的实例具有可比性

答案 1 :(得分:0)

您无法按XML类型进行分组。这是SQL限制,而不是LINQ-to-SQL限制。 (请参阅Group by on XML column field with LINQselect an xml type column in select query with group by SQL Server 2008

是否需要按XML列进行分组?另一种方法是按其他列分组,然后选择第一个XML值作为结果。

Charts = (from c in rs group c by new  
{
    ChartId = c.ChartId,
    FiscalYear = c.FiscalYear,
    ModifiedDate = c.ChartView.ModifiedDate,
    Function = c.Function.DisplayName,
} into cs                     
select new ChartInfo
{
    ChartId = cs.Key.ChartId,
    FiscalYear = cs.Key.FiscalYear,
    ModifiedDate = cs.Key.ModifiedDate,
    Function = cs.Key.Function,
    ChartData=cs.Value.FirstOrDefault().ChartData
}) 

使用LINQ-to-SQL时,仍然可以访问被分组的项目 - 您不需要像在SQL中那样在group by子句中包含每个'selected'属性/列。