Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于文本数据类型不可比较,因此无法将其选择为独立的文本数据类型_C#_Sql Server_Linq - Fatal编程技术网

C# 由于文本数据类型不可比较,因此无法将其选择为独立的文本数据类型

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

我遇到了一个问题,因为我正试图连接到一个旧的第三方数据库并从中检索数据,该数据库使用了现在不推荐使用的文本字段。但是,我无法更改数据库字段,因此当我尝试通过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);
并获取上面的异常。我不希望在运行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);