【问题标题】:IQueryable fills null values with other valuesIQueryable 用其他值填充空值
【发布时间】:2017-01-13 16:25:19
【问题描述】:

这是我想要做的:在我的控制器中获取一个批处理对象列表,我可以将其发送到视图并显示它。它正在工作,但价值混淆了。如果数据库中的值为 null 或 0,则查询用记录中的另一个非 null 值填充它。这是一个例子。

Database Content
    Id:13
    TotalRequest : 10
    TotalProcessed :0
    CreatedDateTime:2017-01-13 13:30:46.090
    CreatedBy:Test
    CompletionDateTime : NULL

Iqueryable at position 13 content
        Id:13
        TotalRequest : 10
        TotalProcessed :10
        CreatedDateTime:2017-01-13 13:30:46.090
        CreatedBy:Test
        CompletionDateTime : NULL

您可以看到 TotalProcessed 不正确。此外,如果我在其中一个对象中有一个不为 null 的 CompletionDateTime,则 List 不在乎并始终输出 null

代码:

            IQueryable<Batch> IBatchList = context.batch.OrderByDescending(b => b.CreatedDateTime);
        var batchList = IBatchList.ToList();

Batch Class(code first DB,所以也是DB的定义)

    public class Batch
{
    [Key]
    public Int64 Id { get; set; }
    public int TotalRequested { get; set; }
    public int TotalProcessed { get; set; }
    public DateTime CreatedDateTime { get; set; }
    public string CreatedBy { get; set; }
    public DateTime? CompletedDateTime { get; set; }
}

Id  TotalRequested  TotalProcessed  CreatedDateTime CreatedBy   CompletedDateTime
13  10  0   2017-01-13 13:30:46.090 Test    NULL

这是来自 Iqueryable 的查询:

{SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[TotalRequested] AS [TotalRequested], 
[Extent1].[TotalProcessed] AS [TotalProcessed], 
[Extent1].[CreatedDateTime] AS [CreatedDateTime], 
[Extent1].[CreatedBy] AS [CreatedBy], 
[Extent1].[CompletedDateTime] AS [CompletedDateTime]
FROM [dbo].[Batch] AS [Extent1]
ORDER BY [Extent1].[CreatedDateTime] DESC}

【问题讨论】:

  • 请发布您的 Batch 类和您的上下文类。
  • IQueryable 是一个接口,它不填充任何内容。 LINQ 只是一种查询语言,它也不修改值。最后,LINQ to EF 生成 SQL 语句,它不会自行修改数据。如果没有 a) 类定义 b) 表模式和 c) 受影响的行,就不可能提供帮助。您可能正在查看错误的行,或者类的属性可能正在替换空值,或者基础查询可能与您的想法不同。
  • 检查生成的 SQL 查询,例如使用 SQL Server Profiler。对数据库执行查询时会发生什么?
  • 我根据您的要求编辑了答案,我会尝试追踪查询
  • 我看不出问题出在哪里,但我会将您的变量 IBatchList 称为 I 前缀通常意味着它是一个接口。

标签: c# asp.net-mvc linq iqueryable


【解决方案1】:

我解决了这个问题,我不知道它为什么会修复它,但是我在查询中添加了一个 where 语句(顺便说一下,CreatedDateTime 永远不会为空,所以我总是会返回我的所有记录)现在我有了所有正确的数据。

 IEnumerable<BatchCode> IBatchCodeList = identityContext.BatchCodes.OrderByDescending(bc => bc.CreatedDateTime).Where(bc=>bc.CreatedDateTime != null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-04
    • 2020-07-13
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多