3

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

有任何想法吗?

4

2 回答 2

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对象现在将是 aList<VacancySummary>而不是IQueryable<anonymous type>. 您可能需要覆盖Equals()您的VacancySummary类以使 distinct 起作用,但您的回报只是变成:

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

更新:看起来你将不得不像在关于同一问题的其他问题中那样处理这个问题

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

于 2012-04-20T14:11:20.863 回答
1

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

于 2012-04-20T14:09:37.713 回答