【问题标题】:Error: "The xml data type cannot be selected as DISTINCT because it is not comparable."错误:“无法将 xml 数据类型选择为 DISTINCT,因为它不可比较。”
【发布时间】:2011-09-19 09:19:20
【问题描述】:

在我的代码中,我有以下 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,因为它不可比较。”

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

【问题讨论】:

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


    【解决方案1】:

    您不能按 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 子句中包含每个“选定”属性/列。

    【讨论】:

    • 嗨,柯克,谢谢您的回复。这个解决方案对我有用,只是稍作改变......我必须进行以下更改:而不是:ChartData=cs.Value.FirstOrDefault().ChartData 我使用 ChartData=cs.FirstOrDefault().ChartData 因为,我没有'找不到属性“值”。
    【解决方案2】:

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

    【讨论】:

    • 你能解释一下吗? ChartData 在数据库表中属于 XML 类型。
    • 我尝试使用 IEqualityComparer 但出现以下错误消息 .... LINQ to Entities 无法识别方法 'System.Collections.Generic.IEnumerable1[test.Model.ChartInfo] Distinct[ChartInfo](System.Collections.Generic.IEnumerable1[test.Model .ChartInfo], System.Collections.Generic.IEqualityComparer`1[test.Model.ChartInfo])' 方法,并且此方法不能翻译成商店表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多