Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 如何重写此Linq查询以避免使用FirstOrDefault?_C#_Entity Framework_Linq - Fatal编程技术网

C# 如何重写此Linq查询以避免使用FirstOrDefault?

C# 如何重写此Linq查询以避免使用FirstOrDefault?,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个Quotes表,它有一个关联的修订表。基本业务规则是报价必须至少有一个修订,但可能有多个修订。我有一个这样开始的问题 var revisions = ctx.Quotes .Select(q => q.Revisions.OrderByDescending(r => r.RevisionNumber).FirstOrDefault()) // Do things with the revisions here... 目的是获取每个报价的最新版本,然后从中选择一些信息

我有一个Quotes表,它有一个关联的修订表。基本业务规则是报价必须至少有一个修订,但可能有多个修订。我有一个这样开始的问题

var revisions = ctx.Quotes
  .Select(q => q.Revisions.OrderByDescending(r => r.RevisionNumber).FirstOrDefault())
  // Do things with the revisions here...
目的是获取每个报价的最新版本,然后从中选择一些信息

这很好,除了数据库中有一个没有任何修订的恶意引用。在上面显示的代码的深处,我遇到了一个异常

转换为值类型“System.Int32”失败,因为 值为空。结果类型的泛型参数或查询 必须使用可为空的类型

这需要一段时间来调试,因为我们没有意识到这是由恶意引用引起的。理想情况下,查询的第二行应该使用First()而不是FirstOrDefault(),后者会在那里引发异常,立即显示问题的根源。然而,实体框架不允许您使用First()或Single()中间查询,这就是我们使用FirstOrDefault()的原因

在不完全重写查询的情况下,即首先查询修订表并导航回报价单(由于其他原因,这将是一件痛苦的事情),有没有一种简单的方法来防止这种情况?在这种情况下,我通过将第一行更改为

var revisions = ctx.Quotes.Where(q => q.Revisions.Any())
…但这是本案的具体解决方案,只有在我们最终发现问题后才明显可见。理想情况下,我希望有一个普遍适用的解决方案。

为了获得内部连接语义,我认为,
Select
/
OrderBy
/
firstorderdefault
的一般替换方法是
SelectMany
/
OrderBy
/
Take(1)


您显示的查询部分似乎很好。我很想知道这是怎么回事。怀疑您将生成的修订投影到提取整数的内容中。请提供整个查询。@tinudu正如我所解释的,我显示的查询部分就是问题所在,因为它假设每个引号都有一个修订版(应该有修订版),而FirstOrDefault()返回默认值,这就导致了下面的问题。不管接下来发生了什么,我什么也做不了,只要查询有东西要枚举,它就会抛出exceptionBrilliaint,这是一种显而易见的简单方法。让我想知道,为什么微软觉得他们不能在EF中实现First(),而他们却实现了Take(1)。谢谢你的回复。
var revisions = ctx.Quotes
    .SelectMany(q => q.Revisions.OrderByDescending(r => r.RevisionNumber).Take(1))
    // Do things with the revisions here...