按日期从索引视图中排除

比特损失

活跃成员
已加入
2016年12月10日
留言内容
35
编程经验
Beginner
在我的数据模型中,我有一份工作清单。当前,作业只有两个州未开发票或已开发票。区别在于发票日期。空缺职位的发票日期为空。

在我的索引视图中,我想启用一个选项以仅查看打开的作业。通常,我对这种观点不感兴趣。虽然所有工作我都可以从其他角度更相关地查看。

在我的SQL表中,作为EF插入的占位符的值是1/01/0001 12:00 AM。我可以在此处更改数据模型以允许为null,但由于我在第一年就没有工作,所以看不到这一点足以达到目的。

我正在努力了解如何编写Lambda语句以排除日期不等于此默认值的任何条目。

我试过了:
C#:
[COLOR=blue]public[/COLOR] [COLOR=blue]async[/COLOR] [COLOR=#2b91af]Task[/COLOR]<[COLOR=#2b91af]IActionResult[/COLOR]> Index()
       {
           [COLOR=blue]var[/COLOR] EVAContext = _context.Job
               .Include(j => j.Site)
                   .ThenInclude(j => j.WaterBodys)
                      [COLOR=green]// .ThenInclude(j=>j.WBName)[/COLOR]
               .AsNoTracking()
               .SingleOrDefaultAsync(j=>j.InvoiceDate==[COLOR=blue]null[/COLOR]);


[COLOR=blue]return[/COLOR] View([COLOR=blue]await[/COLOR] EVAContext.ToListAsync());

尽管这是胡说八道,却在ToListAsync上推了一个错误。

C#:
[COLOR=blue]var[/COLOR] EVAContext = _context.Job
              .Include(j => j.Site)
                  .ThenInclude(j => j.WaterBodys)
                     [COLOR=green]// .ThenInclude(j=>j.WBName)[/COLOR]
              .AsNoTracking()
              .SingleOrDefaultAsync(j=>j.InvoiceDate!=1/1/0001 etc);
                      
                      
            
 
          [COLOR=blue]return[/COLOR] View([COLOR=blue]await[/COLOR] EVAContext.ToListAsync());
这似乎是正确的...除非这给了我一个错误,告诉我在发票日期我不能没有对账单。如何排除不是1/1/0001等的日期?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
为什么要呼叫SingleOrDefaultAsync?该方法有什么作用?那是你真正想要做的吗?

至于您的过滤器,如果您已正确设计数据库,则第一个代码段应正确。使用占位符日期只是一种不好的做法。如果没有日期,则应该没有日期。

如果您要坚持不良的数据库设计,则需要为该比较实际提供一个DateTime值。 C#中没有DateTime文字,因此您需要构造一个适当的DateTime值。
 

比特损失

活跃成员
已加入
2016年12月10日
留言内容
35
编程经验
Beginner
为什么要呼叫SingleOrDefaultAsync?该方法有什么作用?那是你真正想要做的吗?

至于您的过滤器,如果您已正确设计数据库,则第一个代码段应正确。使用占位符日期只是一种不好的做法。如果没有日期,则应该没有日期。

如果您要坚持不良的数据库设计,则需要为该比较实际提供一个DateTime值。 C#中没有DateTime文字,因此您需要构造一个适当的DateTime值。

感谢您的批评。

我在学习。我不是说我是专家。我通过复制教程中的示例并适应自己的应用来学习。我会一直正确吗?不,这就是论坛的目的。

我不确定单一或默认异步功能。我认为从我读到的内容来看,这与Core中的异步代码处理有关。但是我可能误会了。

添加在模型中具有null更好,这很有帮助,而no不是。

所以我应该为空。这对于这种情况非常有用。但是,我将遇到的每一个问题都视为学习的机会。设置null可以解决此问题,但仍然无法回答原始问题。

想象一下,在现实世界中,我想查看当前的财务年度数据。我可能想在代码中插入一个日期,以便只返回某个日期之后的记录,或者我可能想排除特定日期范围内的记录。通过解释我的简单询问,这一切都是可能的。

就像我说的那样,我感谢对日期不为空的批评。我忽略了它的设置。但这不应该成为一个麻烦事,因为毕竟使用日期毕竟是一个常见的数据库问题,或者是否有我在教程或几本书中没有看到的替代方法(但正在慢慢阅读)?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
我会一直正确吗?不,这就是论坛的目的。

我不确定单一或默认异步功能。我认为从我读到的内容来看,这与Core中的异步代码处理有关。但是我可能误会了。
论坛不是您的第一选择。 VS有一个“帮助”菜单是有原因的。为什么不使用该“帮助”菜单甚至F1键来打开文档并阅读该方法(实际上是您正在使用但不熟悉的任何类型或方法)呢?文档不是专门为初学者编写的,因此您不会总是了解它,但是您应该始终先阅读,之后再提问。

有四种类似的方法-First,FirstOrDefault,Single和SingleOrDefault-以及在某些情况下,它们的异步形式。忽略异步部分,在任何给定情况下使用这四种方法中的哪种选择实际上非常简单。在任何情况下都没有最佳选择。

第一:从必须包含至少一个项目的列表中获取第一项。
FirstOrDefault:从列表中获取第一项;如果没有任何项,则为null。
单项:从列表中获取必须包含一个且只有一个项目的唯一项目。
SingleOrDefault:从列表中获取唯一一个不能包含多个项目的项目,如果没有项目,则为null。

鉴于您随后要调用ToListAsync,因此您很明显期望可能会有一个以上的项目,因此不适合使用Single方法。如果可能没有项目,则调用FirstOrDefault(或FirstOrDefaultAsync),否则调用First(或FirstAsync)。
添加在模型中具有null更好,这很有帮助,而no不是。
有帮助如果表中的列在概念上不能容纳任何数据,则该表实际上应该不容纳任何数据,即它应该可以为空。如果该列是可为空的,则只需在使用它之前测试null。在许多情况下,此类数据将自动显示为空白,因此无需进行测试。例如,ASP.NET MVC模型联编程序将在视图中自动显示空字符串以获取空值,而视图中的空字符串将在控制器操作中自动映射回空值。
想象一下,在现实世界中,我想查看当前的财务年度数据。我可能想在代码中插入一个日期,以便只返回某个日期之后的记录,或者我可能想排除特定日期范围内的记录。通过解释我的简单询问,这一切都是可能的。
就像我说的那样,C#中没有诸如DateTime文字之类的东西。您正在尝试在LINQ查询中获取原义的DateTime值,但不能这样做。如前所述,您需要构造一个DateTime值并使用它。您可以声明一个DateTime变量并将其初始化,然后在LINQ查询中使用该变量,也可以直接使用相同的表达式。如果您喜欢学习的机会,我将留给您使用“帮助”菜单打开MSDN文档,找到DateTime类型的主题,并阅读有关如何构造值的信息。 :)
 

比特损失

活跃成员
已加入
2016年12月10日
留言内容
35
编程经验
Beginner
感谢您提供更好的答案。

我确实发现帮助文件令人困惑,并且通常不是论坛是我的首要问题,我通常会在互联网上寻找符合我所寻找目标的东西。没有帮助的是不确定外观方向。这也许是整个学习过程中最令人沮丧的部分。我发现很难理解这种语言。没关系。我不是程序员,我只是一个有天赋的技术用户。

如果我在一个更有利可图的行业工作,那么我将不必在这个领域那么努力。但是需要。我想有点像您自己决定自己盖房子。

再次感谢
 

比特损失

活跃成员
已加入
2016年12月10日
留言内容
35
编程经验
Beginner
只是另一个注释或通过评论。我面临的一些问题并不是我自己的理解或理解。我发现的是,这些教程经常假定具有先验知识,而在较旧版本的教程中可以更好地解释这些知识。仅此一项就很困难,因为有时为3.5清楚地说明的概念对于5.0完全消失了,以此类推。
 
最佳 底部