首页 > 解决方案 > 包含多个属性的位置

问题描述

我有一个集合(本地数组,从其他地方填充),其中包含一组Sectionand Lines。这些不是主键。

说这样的话:

class SectionLine {
  int Section { get; }
  int Line { get; }
}
class MyEntity {
  int EntityId { get; set; }
  int Section { get; set; }
  int Line { get; set; }
  string OtherProperty { get, set; } 
  // Many other options...
}
// ...
SectionLine[] allSectionLines = new [] { new SectionLine { Section = 5, Line = 2 }, new SectionLine { Section = 5, Line = 3 }, // etc.

因此,我想在 DbContext 上过滤我的集合,以查找与数组中任何部分和行都匹配的那些allSectionLines

请注意,实体上的Sectionand不是主键,但它们确实有一个多列索引,如果它可以使用,那就太好了。LineMyEntity

我可以看到几个选项,但我不喜欢任何选项......即:

var sectionLines = allSectionsLines.Select(x => x.Section + "-" + x.Line);
var myQuery = _dbContext.MyEntities.Where(x => sectionLines.Contains(x.Section + "-" + x.Line));

这可行,但它会进行全表扫描并且不考虑索引,所以我宁愿避免它

我现在正在做另一个 hack(将实体投影到一个简单的类似 DTO 的类型,只有 ID、Section 和 Line,然后在内存中过滤并获取 ID,然后再次查询这些 ID)。这只是因为那里的数据以及实际服务器的可用内存和速度,但我不喜欢它

我还没有找到另一种方法来进行这样的查询,最好是直接在实体框架上,它不会浪费内存,额外的“看似不需要”的查询,并且可以使用数据库上的索引而不是进行全面扫描?

这是 EF Core 3.1

附录:我目前的想法是为“Section-Line”字符串添加一个计算字段(带有索引)并在那里执行查询......再次,我不是数据库的所有者,所以我不希望“不得不要求”......但如果这是我真正能做到的唯一方法。并不是说它无法解决……我只是在评估替代方案,看看我是否遗漏了一个明显的替代方案

标签: c#entity-framework-core

解决方案


推荐阅读