文本数据类型不能选择为 DISTINCT ,因为它不具有可比性

本文关键字:可比性 因为 不能 数据类型 选择 DISTINCT 文本 | 更新日期: 2023-09-27 18:31:57

我遇到了问题,因为我正在尝试连接一个旧的第三方数据库并从中检索数据,该数据库使用现已弃用的文本字段。但是,我无法更改数据库字段,因此当我尝试通过 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 之前返回结果,因为如果每个用户检索每个搜索的所有记录,服务器带宽的性能就会受到影响,这就是为什么只返回一部分数据的原因。

有什么想法吗?

文本数据类型不能选择为 DISTINCT ,因为它不具有可比性

哪些

列是text类型?

一个想法可能是不要编写Distinct(),以便它在SQL中执行此操作。您可以将数据查询到一组具体的对象中,然后使用 LINQ to 对象尝试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>。您可能需要覆盖 VacancySummary 类上的Equals()才能使非重复类正常工作,但您的返回只是:

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

更新:看起来您将不得不像在有关同一问题的另一个问题中一样处理这个问题。

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

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

相关文章: