【问题标题】:Entity Framework: Check if value is nothing without reading all the data?实体框架:在不读取所有数据的情况下检查值是否为空?
【发布时间】:2019-12-23 10:40:31
【问题描述】:

我正在寻找一种通过 EF 查询测试 db 字段的方法,只是为了查看它是否为空,但无需读取全部数据。如果它不为空,它将非常大并且有很多行,因此以标准方式执行此操作(如下面的 sn-p 所示)是对数据库的一项非常繁重的操作并且需要很长时间。我想要的是让用户知道哪些行在该字段中有一些数据,然后他们可以选择查看它,然后对该行执行单个操作以仅返回该数据。

我觉得这应该是可能的,测试看某物是否有价值不需要读取所有数据,那么有没有办法达到预期的结果?

Class MyClassModel 
   Property HasData As Boolean?

   Function Query (DB as DBContext)  As IEnumerable(Of MyClassLineModel)
    Dim data As IQueryable(Of MyClass) = DB.MyClasses

        If HasData.HasValue Then data = From t In data Where t.Data IsNot Nothing = HasData

                    Dim ret = (From t In data Select New MyClassLineModel With {    
                                    .HasData = t.Data IsNot Nothing}).ToArray

        Return ret
  End Function 
End Class

Class MyClassLineModel 
    Property HasData As Boolean?
End Class

附言这是一个 MVC 项目,因此是“模型”等。但是这个问题仍然普遍适用。


编辑

NVM,原来是 EF 为我做的。上述代码转换为 db 查询

CASE WHEN Data IS NULL THEN 0 ELSE 1 END

它不会读取整个字段。响应时间很好。 Mods 可以删除 Q,或将其保留给任何想知道的人。感谢所有的答案家伙。

【问题讨论】:

  • 1.在要搜索的列上创建索引; 2. 使用过滤器仅检索非空行,并可能添加Take 以返回合理的数量(可以显示给用户)。从数据库的角度来看,您的问题实际上没有意义。你不能测试“一个领域”。您可以结合一些行(元组)测试一个字段,也可以测试每一行。

标签: sql database vb.net entity-framework model-view-controller


【解决方案1】:

您可以使用 .Any() - 如果您在由 SQL 支持的 IQueryable 上使用它,它将执行类似于 SQL 中存在的 WHERE EXISTS 的操作,不会读取所有数据...

var dataExists = _dataContext.Entity.Any(e => e.Field != NULL);

【讨论】:

    猜你喜欢
    • 2010-12-04
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多