问题:
在C#中,在IIS部署的解决方案上具有Angular 6前端的MVC API。
一个简单的HTML表,在特定列上具有8个过滤字段,通过API HttpGet调用在后端运行查询。该函数本身可以正常运行,但对于特定的字符串为NOT。例如,在字段“描述”上,后端返回“数据为空”。使用下面的字符串时,不能在Null值上调用此方法或属性。值在前端和后端之间正确传递,并且API调用通常返回适当的数据。
但是,诸如app
之类的字符串比app
,application
之类的字符串和诸如cert
更长的字符串将返回“数据为空”错误。
如果我使用certificate
作为f
的输入,则会收到“数据为空”错误。但是,如果我在transmittal
上使用crc
,并且THEN使用document
作为f
的输入,该函数将返回普通数据?
这仅在部署状态下发生,调试代码时不会发生此问题。调试时,代码返回预期结果,并始终产生正确的响应。
使用一组“链接” where语句构建IQueryable的服务调用,该IQueryable被调用以在序列末尾返回transmittal
。
正在使用:
控制器代码
.ToListAsync()
ArchiveService代码
[HttpGet("[action]")]
public async Task<IActionResult> Search(string TR, string DA, string DO, string RE, string TY, string DD, string DI, string OR, string DE)
{
return Ok(await _archiveService.Search(TR, DA, DO, RE, TY, DD, DI, OR, DE));
}
给出错误的字段是具有public async Task<IEnumerable<object>> Search(
string transmittal,
string date,
string document,
string revision,
string type,
string description,
string discipline,
string origin,
string destination)
{
var result = _db.TblCorrespondenceLog.AsQueryable();
if (!string.IsNullOrEmpty(transmittal))
result = result.Where(f => f.TransmittalNo.Contains(transmittal));
if (!string.IsNullOrEmpty(date))
{
}
if (!string.IsNullOrEmpty(document))
result = result.Where(f => f.CompanyDocumentNo.ToLower().Contains(document));
if (!string.IsNullOrEmpty(type))
result = result.Where(f => f.DocumentType.ToLower() == type);
if (!string.IsNullOrEmpty(description))
result = result.Where(f => f.DocumentDescription.ToLower().Contains(description));
if (!string.IsNullOrEmpty(discipline))
result = result.Where(f => f.Discipline.ToLower() == discipline);
if (!string.IsNullOrEmpty(origin))
result = result.Where(f => f.OriginatorCode.ToLower() == origin);
if (!string.IsNullOrEmpty(destination))
result = result.Where(f => f.SupplierCode.ToLower() == destination);
return await result.ToListAsync();
}
子句的字段
[当我使用SQL编写器获取被触发到服务器的查询时,我得到以下查询,当调用.Contains()
时,将导致“数据为空”错误:
.ToListAsync()
哪个,当从SMSS(SQL Server Management Studio 2018)触发时,可以很好地工作吗?
如果我将SELECT [f].[uID], [f].[Action_Required], [f].[Approved_Responded], [f].[Area_Code], [f].[Company_Document_No],
[f].[Discipline], [f].[Document_Description], [f].[Document_Type], [f].[fileUID], [f].[Link], [f].[Originator_Code],
[f].[Reference_Document], [f].[ResponsibelEngineer], [f].[ResubDate], [f].[ResubTransmittal], [f].[Rev],
[f].[Sequential_Number], [f].[Sheet_Number], [f].[Supplier_Code], [f].[TDate], [f].[Transmittal_Date], [f].[Transmittal_No],
[f].[Transmittal_Type], [f].[TRN_Originator], [f].[TurnAroundDate], [f].[Unit_Code],
[f].[TransmitUID]
FROM [tblCorrespondenceLog] AS [f]
WHERE CHARINDEX(N'f', [f].[Transmittal_No]) > 0
用作crc
的输入,我将返回正常返回的数据,但查询仅稍有不同:
document
所以...为什么实体框架仅在特定字符串和特定组合上给我一个“数据为空”错误。即使在“问题”字段上进行过滤,该函数将以其他方式返回适当的值(当然使用不同的字符串)?
这是由.NET Core实体类与数据库表之间的断开连接引起的;
类配置设置为:
SELECT [f].[uID], [f].[Action_Required], [f].[Approved_Responded], [f].[Area_Code], [f].[Company_Document_No],
[f].[Discipline], [f].[Document_Description], [f].[Document_Type], [f].[fileUID], [f].[Link], [f].[Originator_Code],
[f].[Reference_Document], [f].[ResponsibelEngineer], [f].[ResubDate], [f].[ResubTransmittal], [f].[Rev],
[f].[Sequential_Number], [f].[Sheet_Number], [f].[Supplier_Code], [f].[TDate], [f].[Transmittal_Date], [f].[Transmittal_No],
[f].[Transmittal_Type], [f].[TRN_Originator], [f].[TurnAroundDate], [f].[Unit_Code],
[f].[TransmitUID]
FROM [tblCorrespondenceLog] AS [f]
WHERE (CHARINDEX(N'f', [f].[Transmittal_No]) > 0) AND (CHARINDEX(N'crc', LOWER([f].[Company_Document_No])) > 0)
但是数据库表的此字段为 builder.Property(e => e.DocumentDescription)
.IsRequired()
.HasColumnName("Document_Description")
.HasMaxLength(150);
,因此有时在实体框架不希望看到allow null
的情况下返回null
。
删除null
位完成了该工作。
.IsRequired()
虽然很有趣,但这在开发环境中不会产生错误,但是DID在部署时会引起问题。我还无法弄清为什么会有区别,但至少现在可以了!