LINQ to SQL 过滤子集合

LINQ to SQL filter child collection

我正在为这个查询而苦苦挣扎,我想我遗漏了什么。 我有两个自动生成的 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;
    }

目前,我正在加载所有匹配的 regualatorsOrganizationView,并对在线下的监管机构进行过滤。

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

         

但是我加载 redundent Regulators 只是为了稍后过滤掉它们。 我如何重建此查询以仅加载来自初学者的匹配调节器?

它尝试使用 Select() 来分配监管机构的 regulatorOrgnization 过滤器列表。

            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'。”

看起来过滤 Include() 是一个选项(就像在 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

后者就像Entity Framework中的Include。前者使它的行为类似于过滤 Include,或者更接近于全局查询过滤器。

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