C# 由于文本数据类型不可比较,因此无法将其选择为独立的文本数据类型
我遇到了一个问题,因为我正试图连接到一个旧的第三方数据库并从中检索数据,该数据库使用了现在不推荐使用的文本字段。但是,我无法更改数据库字段,因此当我尝试通过LINQ返回数据时,它会给我带来问题。示例代码如下:C# 由于文本数据类型不可比较,因此无法将其选择为独立的文本数据类型,c#,sql-server,linq,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
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);
并获取上面的异常。我不希望在运行Distinct之前先执行整个SQL语句并返回结果,因为如果每个用户检索每个搜索的所有记录,服务器带宽会受到性能影响,这就是为什么只返回一部分数据的原因
有什么想法吗?不是linq用户,但在tsql中,我们将把它转换为可比较的varchar。尝试使用ToString()或表达式。如果字段太大(如超过8000个字符),请转换并在必要时截断该字段。哪些列是
文本类型
一个想法可能是不要编写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();
您的查询
对象现在将是列表
,而不是IQueryable
更新2:听说过实体框架中的模型定义函数吗?退房您可以创建概念函数(例如,知道如何将文本
列转换为varchar(max)
(即convert(varchar(max),PlacementNotes)
)。然后,您可以创建一些代码用于LINQ查询,这些代码将包含在生成的SQL中。不知道它是否对你有用,但也许值得一试 如果它已被弃用,为什么不拉取该字段?@kh25:您能够在该数据库中创建视图吗?我建议在带有text
列的表顶部创建一个视图,除了将text
列转换为varchar(max)
,然后使用LINQ从视图中进行查询之外。很遗憾,@Cory I的可能副本在此阶段无法修改数据库。如果有,我会将字段更改为varchar。作为一个复制品,我不能使用相同的解决方案,因为我没有访问数据库所需的权限。这是我们无法控制的第三方数据库代码>它会在底层SQL调用中足够早地转换它吗?谢谢@Cory-PlacementNotes。由于每个用户返回的数据量存在巨大差异,我试图阻止在跳过和获取之前执行ToList()(这可能会对客户收费,因为他们将根据返回的数据量计费)。如果不可能,我会将初始查询分为两个单独的查询。@kh25:您可以将PlacementNotes完全排除在查询之外,然后稍后通过tsearch.GUID
(VacancySummary.Id)进行查找。如果在对数据库的一次点击中无法完成所需的操作,那么这确实看起来像是一种方法。如果我选择这个解决方案,我会在以后公布细节。@kh25:我用另一个建议更新了我的答案;请参阅“更新2”。谢谢@Cory-今天晚些时候我会看一看。
return query.Distinct().Skip(skip).Take(take);