无法将文本数据类型选为DISTINCT,因为它不具有可比性

时间:2012-04-20 13:46:19

标签: c# sql-server linq

我遇到了问题,因为我正在尝试连接到旧的第三方数据库,并使用现在已弃用的文本字段从中检索数据。但是,我无法更改数据库字段,因此当我尝试通过LINQ返回数据时,它会导致我出现问题。示例代码如下:

var query = from s in db.tSearches
            join c in db.tCompanies on s.CompanyGUID equals c.GUID
            join cl in db.tCompanyLocations on s.LocationGUID equals cl.GUID
            join st in db.tSearchTypes on s.SearchTypeGUID equals st.GUID
            where s.DateClosed == null                        
            select new
            {
                Id = s.GUID,
                Type = st.GUID,
                Location = cl.LocationName,
                Company = (s.Confidential) ? String.Empty : c.CompanyName,
                DateOpened = s.DateOpened,
                Notes = s.PlacementNotes,
                Closed = s.DateClosed != null
            };

在我最终尝试执行此操作之前,已对此信息进行了一些过滤:

        return query.Select(x => new VacancySummary
        {
            Id = x.Id,
            Departments = "",
            Location = x.Location,
            Company = x.Company,
            DateOpened = x.DateOpened,
            Notes = x.Notes,
            Closed = x.Closed
        }).Distinct().Skip(skip).Take(take);

并获得上述例外。我宁愿不必首先执行整个SQL语句并在运行Distinct之前返回结果,因为如果每个用户检索到每个搜索的所有记录,那么服务器带宽就会受到性能损失,这就是为什么只有一部分返回数据。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

哪些列是text类型?

一个想法可能是不写Distinct(),以便它在SQL中执行。您可以将数据查询到一组具体的对象中,然后使用LINQ to Objects来尝试Distinct()

从您拥有的内容开始,将原始查询转换为空缺摘要列表:

var query = (from s in db.tSearches
            join c in db.tCompanies on s.CompanyGUID equals c.GUID
            join cl in db.tCompanyLocations on s.LocationGUID equals cl.GUID
            join st in db.tSearchTypes on s.SearchTypeGUID equals st.GUID
            where s.DateClosed == null                        
            select new VacancySummary()
            {
                Id = s.GUID,
                Departments = string.Empty,
                Type = st.GUID,
                Location = cl.LocationName,
                Company = (s.Confidential) ? String.Empty : c.CompanyName,
                DateOpened = s.DateOpened,
                Notes = s.PlacementNotes,
                Closed = s.DateClosed != null
            }).ToList();

您的query对象现在是List<VacancySummary>而不是IQueryable<anonymous type>。您可能需要覆盖Equals()课程上的VacancySummary,以使其能够发挥作用,但您的回报只会变为:

return query.Distinct().Skip(skip).Take(take);

更新:您似乎必须按照in your other question about the same issue的方式处理此问题。

更新2:您是否听说过实体框架中的模型定义函数?查看this article。您可以创建概念功能(例如,知道如何将text列转换为varchar(max)(即CONVERT(varchar(max), PlacementNotes))的功能。然后,您可以创建一些代码,以便在LINQ查询中使用,这些代码将包含在生成的SQL中。不知道它是否适合你,但也许值得一试!

答案 1 :(得分:1)

不是linq用户,但在tsql中我们只是将它转换为可比较的varchar。尝试使用ToString()或Expression.Convert,并在必要时截断字段,如果它很大,超过8000个字符。