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;
}
- 我需要按名称应用过滤,输入字符串“filterText”应该是 regulatorName
的一部分
- 如果调节器不匹配 - 应该从 regulatorsViews 中过滤掉
- 如果 regulatorOrganizationView 在 regulatorsViews 中至少有一个匹配 - 应该包括在内
- 如果 regulatorOrganizationView 的 regulatorsViews 集合没有匹配条件的调节器,但它的名称包含 filterText - 它应该被包含。
目前,我正在加载所有匹配的 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
调用,但如果数据库排序规则不区分大小写,则不需要它们。
我正在为这个查询而苦苦挣扎,我想我遗漏了什么。 我有两个自动生成的 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 的一部分
- 如果调节器不匹配 - 应该从 regulatorsViews 中过滤掉
- 如果 regulatorOrganizationView 在 regulatorsViews 中至少有一个匹配 - 应该包括在内
- 如果 regulatorOrganizationView 的 regulatorsViews 集合没有匹配条件的调节器,但它的名称包含 filterText - 它应该被包含。
目前,我正在加载所有匹配的 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
调用,但如果数据库排序规则不区分大小写,则不需要它们。