Linq to sql查询没有返回正确的项目

时间:2015-03-18 11:10:31

标签: c# asp.net-mvc linq-to-sql

您好我的数据库查询有问题。虽然我的标题与其他一些问题类似,但我已经在这里查看了问题并且没有发现任何相似之处。我正在处理的站点可以创建收集请求,然后在表中查看它们以管理现有请求。我使用的第一个查询工作并返回正确的请求。原始查询可以在下面看到。

var query = context.LogisticsRequests.AsQueryable().Where(x => x.Type == types.Collection.ToString());

添加了一个删除请求的新选项,但这只是数据库中名为isDeleted的新列,这样就可以从表中删除请求,但仍有一个存档副本。因此,为了过滤掉已删除的请求,我更新了查询,如下所示。

var query = context.LogisticsRequests.AsQueryable().Where(x => x.Type == types.Collection.ToString() && x.isDeleted != true);

更改查询后,没有返回任何结果,并且我无法理解为什么,只有一个请求被设置为删除,而其他大多数请求都将具有空值,因此它们仍应返回,因为它们不等于true。我已经在下面列出了一些截图,显示了查询结果和发送到数据库的查询。感谢您提供任何帮助或建议。

enter image description here

发送到db的查询:

    {SELECT [t0].[LogisticsRequestId], [t0].[CreatedOn], [t0].[ModifiedOn], [t0].[CreatedById], [t0].[ModifiedById], [t0].[Type], [t0].[ClientId], [t0].[SupplierReference], [t0].[DateRequested], [t0].[CourierType], [t0].[ClientName], [t0].[Laboratory], [t0].[LaboratoryId], [t0].[Reference], [t0].[SpecialInstructions], [t0].[ContactName], [t0].[ContactNo], [t0].[ContactEmail], [t0].[CollectionAddress], [t0].[UserLogisticsAddressId], [t0].[ClientLogisticsAddressId], [t0].[SiteName], [t0].[CollectionInstructions], [t0].[RequestDetails], [t0].[EstimatedDeliveryDate], [t0].[Status], [t0].[Comment], [t0].[NumberCoolBoxes], [t0].[CollectionFrom], [t0].[CollectionTo], [t0].[CallBefore], [t0].[PleaseCall], [t0].[isDeleted]
FROM [dbo].[LogisticsRequest] AS [t0]
WHERE ([t0].[Type] = @p0) AND (NOT ([t0].[isDeleted] = 1))
}

再次感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

确保在IsDelete列中必须有值。对于所有记录,它必须是truefalse。确保您没有在null列中存储IsDelete。如果它为空,则您必须设置truefalse

将您的查询更改为

var query = context.LogisticsRequests.AsQueryable().Where(x => x.Type == types.Collection.ToString() && !(x.isDeleted == null ? false : x.IsDeleted));

答案 1 :(得分:0)

您应该检查新列"是否已删除"填充所有行。如果新创建了列,则可能包含null,因此SQL查询将失败。使用truefalse填充表格。

另外,正如评论中所提到的,你应该使用"!isDeleted"。

答案 2 :(得分:0)

对此感到好奇

Where(x => x.Type == types.Collection.ToString()

是类型集合的类型?然后它应该读

 types.Collection.Contains(x.Type)

喜欢这样

Where(x => types.Collection.Contains(x.Type) && !x.isDeleted)