LINQ to SQL筛选器子集合



我对这个查询感到困惑,我想我遗漏了一些东西。我有两个自动生成的dbml模型。

public partial class RegulatorsOrganizationView
{
private int regulatorOrgId;
private string regulatorOrgName;
private EntitySet<RegulatorsView> regulatorsViews;
}
public partial class RegulatorsView
{
private int regulatorId;
private string regulatorName;
}
  • 我需要按名称应用过滤,输入字符串";filterText";应该是regulatorName的一部分
  • 如果调节器不匹配-应从调节器中筛选出来视图
  • 如果regulatorOrganizationView在regulatorViews中至少有一个匹配项-应包括在内
  • 如果regulatorOrganizationView的regulatorViews集合没有与条件匹配的调节器,但其名称包含filterText,则应将其包含在内

目前我正在加载所有匹配的regulatorOrganizationViews,并对后续的regulator进行筛选。

List<RegulatorOrganizationView> regOrgs = boatDataContext.RegulatorOrganizationView
.Where(r => r.RegulatorsViews.Any(ar => ar.regulatorName.ToUpper().Contains(filterText.ToUpper()))
|| r.regulatorName.ToUpper().Contains(filterText.ToUpper())
.ToList();

但通过这种方式,我加载冗余调节器,只是为了稍后将其过滤掉。如何重建此查询以仅从启动器加载匹配的调节器?

它试图使用Select((来分配regulatorOrganization筛选器列表的Regulator。

regulatorsOrgs = DataContext.RegulatorOrganizationViews
.Where(ro => ro.regulatorOrgName.ToUpper().Contains(filterText.ToUpper())
|| ro.RegulatorsViews.Any(r => r.regulatorName.ToUpper().Contains(filterText.ToUpper()))
.Select(ro => new RegulatorOrganizationView()
{
regulatorId = ro.regulatorId,
regulatorOrgName = ro.regulatorOrgName,
RegulatorsViews = ro.RegulatorsViews
.Where(r => r.regulatorName.ToUpper().Contains(filterText.ToUpper())
.Select(r => new RegulatorsView()
{
regulatorId = r.regulatorId,
regulatorName = r.regulatorName,
}).ToEntitySet()

}).ToList();

但我得到了一个例外:消息="不允许在查询中显式构造实体类型"RegulatorsOrganizationView">

看起来filteredInclude((是一个选项(就像在EF中一样(,但我找不到将其与Linq-to-SQL一起使用的方法。有什么想法吗?

在LINQ to SQL中,这样做有点混乱,而且不直观。您必须使用DataLoadOptions:

var opt = new DataLoadOptions();
opt.AssociateWith((RegulatorsOrganizationView v) 
=> v.regulatorsViews.Where(ar => ar.regulatorName.Contains(filterText)));
opt.LoadWith((RegulatorsOrganizationView v) => => v.regulatorsViews);
DataContext.LoadOptions = opt;
var result = DataContext.RegulatorOrganizationViews
.Where(ro => ro.regulatorOrgName.Contains(filterText) 
&& ro.regulatorsViews.Any());

这样说:当加载RegulatorOrganizationViews时,它们的regulatorsViews相关联时,使它们满足给定的条件。

然后它说:当加载RegulatorOrganizationViews时,也加载他们的regulatorsViews

后者类似于实体框架中的Include。前者使其表现得像经过过滤的Include,或者更接近全局查询过滤器。

为了简洁起见,我删除了ToUpper调用,但如果数据库排序规则不区分大小写,则不需要它们。

最新更新