我对这个查询感到困惑,我想我遗漏了一些东西。我有两个自动生成的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
调用,但如果数据库排序规则不区分大小写,则不需要它们。