检查实体框架中是否存在对象的最佳方法?

Fre*_*ddy 108 linq-to-entities entity-framework exists

从性能的角度来看,检查数据库中是否存在对象的最佳方法是什么?我正在使用Entity Framework 1.0(ASP.NET 3.5 SP1).

Ale*_*gas 217

如果您不想直接执行SQL,最好的方法是使用Any().这是因为Any()会在找到匹配后立即返回.另一个选项是Count(),但这可能需要在返回之前检查每一行.

以下是如何使用它的示例:

if (context.MyEntity.Any(o => o.Id == idToMatch))
{
    // Match!
}
Run Code Online (Sandbox Code Playgroud)

在vb.net中

If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
    ' Match!
End If
Run Code Online (Sandbox Code Playgroud)


Kon*_*man 9

从性能的角度来看,我猜使用EXISTS命令的直接SQL查询是合适的.请参阅此处了解如何在Entity Framework中直接执行SQL:http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx

  • 接受答案的Any()函数映射到EXISTS() (4认同)

Pro*_*rod 5

我必须管理这样一个场景,其中新数据记录中提供的重复项百分比非常高,并且进行了数千次数据库调用以检查重复项(因此 CPU 以 100% 的速度发送了大量时间)。最后我决定将最后 100,000 条记录缓存在内存中。通过这种方式,我可以针对缓存记录检查重复项,这与针对 SQL 数据库的 LINQ 查询相比非常快,然后将任何真正的新记录写入数据库(并将它们添加到数据缓存中,我也排序和修剪以保持其长度易于管理)。

请注意,原始数据是一个 CSV 文件,其中包含许多必须解析的单个记录。每个连续文件中的记录(以每 5 分钟大约 1 个的速度出现)有相当大的重叠,因此重复的百分比很高。

简而言之,如果您对传入的原始数据进行了时间戳记,几乎是按顺序排列的,那么使用内存缓存可能有助于记录重复检查。

  • 很多时候,我们的开发人员提出您的方案时,可能会有一些曲折。我想请求您用 C# 翻译您的解决方案,以便我们和许多即将到来的开发人员受益。+1。我也希望将解决方案扩展为博客文章!:) (3认同)