C# 其中包含多个属性

C# 其中包含多个属性,c#,entity-framework-core,C#,Entity Framework Core,我有一个集合(本地数组,从别处填充),其中包含一组部分和行。这些不是主键 说这样的话: 类剖面线{ int节{get;} int行{get;} } 类实体{ int EntityId{get;set;} int节{get;set;} int行{get;set;} 字符串OtherProperty{get,set;} //还有很多其他的选择。。。 } // ... SectionLine[]所有SECTIONLINES=new[]{new SectionLine{Section=5,Line=2}

我有一个集合(本地数组,从别处填充),其中包含一组
部分
。这些不是主键

说这样的话:

类剖面线{
int节{get;}
int行{get;}
}
类实体{
int EntityId{get;set;}
int节{get;set;}
int行{get;set;}
字符串OtherProperty{get,set;}
//还有很多其他的选择。。。
}
// ...
SectionLine[]所有SECTIONLINES=new[]{new SectionLine{Section=5,Line=2},new SectionLine{Section=5,Line=3},//等等。
因此,我想在DbContext上过滤我的集合,以从数组
allSectionLines
中的任何一个中同时匹配-section和line的集合

请注意,实体
MyEntity
上的
部分和
不是主键,但它们确实有一个多列索引,如果可以使用的话,这将非常有用

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

  • 多个查询,
    allSectionLines
    中的每个元素一个查询。此数组来自不同的源(它不是静态代码)并且可能有很多元素,所以我不喜欢这样。Edit:这也适用于生成包含许多
    子句的复合谓词…如果数组集合中的数字足够大,我相信这将执行得相当糟糕
  • 从多属性创建单个属性,类似于:
var sectionLines=allSectionsLines.Select(x=>x.Section+“-”+x.Line);
var myQuery=_dbContext.myenties.Where(x=>sectionLines.Contains(x.Section+“-”+x.Line));
这是可行的,但是它会进行全表扫描,并且不考虑索引,所以我宁愿避免使用它

  • 在数据库上创建一个存储过程并执行一些多列联接,首先在临时表上插入数组(或将此表作为参数传递):这肯定有效,但此数据库由其他人管理,我没有进行任何类型的迁移。我肯定可以要求SP在那里…但如果它可以通过代码解决,我更愿意在不“接触”数据库架构的情况下进行
还有另一个我正在做的黑客(将实体投影到一个简单的DTO类型,只使用ID、Section和Line,然后在内存中过滤并获取ID,然后再次查询这些ID)。这仅仅是因为存在数据以及实际服务器的可用内存和速度,但我不喜欢它

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

这是EF核心3.1


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

。其中(s=>sections.Contains(s.Section)和&lines.Contains(s.Line))
a选项?然后在内存中应用组合过滤器?或者这会带来太多数据?@Oliver这可能会起作用,但索引同时用于两个属性(不是单独的节和行),因此这样做也不会使用索引,并且会进行完整的表扫描……我宁愿使用一个组合的临时“字符串”(如第二个项目符号中所示)如果是这样的话,通过这个来过滤这个问题是否回答了你的问题?@Oliver基本上该帖子上的所有答案(包括投票最多的,有很多)都暴露了我在这里给出的“解决方案”是“不喜欢”。运气不好,似乎……除非有人提出新的想法,否则我将不得不选择一个我不喜欢的解决方案:-@Jcl的确,那里没有一个解决方案看起来是理想的-但是我认为根据您所述的条件,这可能是答案。Is
。Where(s=>sections.Contains(s.Section)&&lines.Contains(s.Line))
a选项?然后在内存中应用组合过滤器?或者这会带来太多数据?@Oliver这可能会起作用,但索引同时用于两个属性(不是单独的节和行),因此这样做也不会使用索引,并且会进行完整的表扫描……我宁愿使用一个组合的临时“字符串”(如第二个项目符号中所示)如果是这样的话,通过这个来过滤这个问题是否回答了你的问题?@Oliver基本上该帖子上的所有答案(包括投票最多的,有很多)都暴露了我在这里给出的“解决方案”是“不喜欢”.看来运气不好……除非有人提出新的想法,否则我只能选择一个我不喜欢的解决方案:-@Jcl确实,那里没有一个解决方案看起来是理想的-不过,我认为这可能是基于您所述条件的答案。