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