Linq 错误:";xml数据类型不能被选择为独立的,因为它是不可比较的;

Linq 错误:";xml数据类型不能被选择为独立的,因为它是不可比较的;,linq,linq-to-sql,entity-framework-4,linq-to-entities,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,

在我的代码中,我有以下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 
                    })
    }});
IQueryable图表=(来自ctx中的报告。图表组报告按新
{ 
名称=report.ChartTitle.ChartType.ChartCategory.CategoryName,
id=report.ChartTitle.ChartType.ChartCategory.ChartCategoryId,
期间=报告。期间
}进入d
选择新数据
{
Name=d.Key.Name,
Id=d.Key.Id,
句号=d.Key.Period,
报告=来自d组r中的r的新报告
{Title=r.ChartTitle.Name,id=r.ChartTitle.ChartTitleId}
选择新报告
{
Title=rs.Key.Title,
Id=rs.Key.Id,
图表=(根据新的
{ 
ChartId=c.ChartId,
财政部,
ModifiedDate=c.ChartView.ModifiedDate,
Function=c.Function.DisplayName,
ChartData=c.ChartView.ViewData
}进入cs
选择新建图表信息
{ 
ChartId=cs.Key.ChartId,
FiscalYear=cs.Key.FiscalYear,
ModifiedDate=cs.Key.ModifiedDate,
函数=cs.Key.Function,
ChartData=cs.Key.ChartData
})
}});
在上面的代码中,如果排除“ChartData”字段(它是XML数据类型),查询将正常执行。但是,当我包含此字段时,它抛出以下错误:“xml数据类型不能被选择为独立的,因为它不可比较。”


让我知道我在这里遗漏了什么?

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

您不能按XML类型分组。这是一个SQL限制,而不是LINQ到SQL检索。(见和)

是否需要按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”属性/列。

您能再解释一下吗?ChartData在数据库表中为XML类型。我尝试使用IEqualityComparer,但出现以下错误消息。。。。LINQ to实体无法识别方法“System.Collections.Generic.IEnumerable
1[test.Model.ChartInfo]Distinct[ChartInfo](System.Collections.Generic.IEnumerable
1[test.Model.ChartInfo],System.Collections.Generic.IEqualityComparer`1[test.Model.ChartInfo]),这个方法不能翻译成商店表达式。嘿,柯克,谢谢你的回复。这个解决方案对我来说只做了一点小小的更改…我必须做以下更改:而不是:ChartData=cs.Value.FirstOrDefault().ChartData我使用了ChartData=cs.FirstOrDefault().ChartData,因为我没有找到属性“Value”。