如何解决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的一部分
- 如果监管者不匹配 - 应该从监管者视图中过滤掉
- 如果regulatoryOrganizationView 在regulatorsViews 中至少有一个匹配项 - 应该被包含
- 如果regulatorsOrganizationView 的regulatorsViews 集合没有匹配条件的regulators,但它的名称包含filterText - 应该包括它。
目前我正在加载所有匹配的监管者组织视图,并对监管者进行过滤。
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() 分配 Regulators 的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();
但我收到异常:Message=“不允许在查询中显式构造实体类型“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
。
后者类似于实体框架中的 Include
。前者使它的行为类似于过滤的 Include
,或者更接近于全局查询过滤器。
为简洁起见,我删除了 ToUpper
调用,但如果数据库排序规则不区分大小写,则不需要它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。