在 EF 中使用中间实体查询多对多的微风



我正在使用EF6,WebApi2,AngularJS和BreezeJs。

我有以下实体:

Person
{
   public string Name { get; set;}
   public virtual ICollection<GenericProfileCountry> Countries { get; protected set; }
}
public class GenericProfileCountry
{
    public string PersonId{ get; set; }
    public virtual Person Person{ get; set; }
    public string CountryIso { get; set; }
    public virtual Country Country { get; set; }
}
public class Country
{
    public string Iso { get; set; }
    public string Name { get; set; }
}

现在我有一个查询,让所有人都轻而易举地吹拂,如下所示:

return zEntityQuery.from('Contacts').expand('Profile, Countries')
        .orderBy(contactOrderBy)
        .toType(entityName)
        .using(self.manager).execute()
        .to$q(querySucceeded, self._queryFailed);

我想做的是使用中间实体上的条件对上述查询执行 where 语句。所以说我只想带他们的第一个国家(一个人可以有多个国家)iso代码等于"GB"的联系人。

在Linq中,它将类似于Contacts.Where(contact => contact。国家.第一().国家/地区 == 'GB')

在微风的位置(谓词)中可以表达类似的东西吗?我想走另一条路(从中间表开始并从那里过滤),但不确定这是否是正确的方法。

您可以通过

使用关键字 anyall 创建谓词来实现这一点

.where('Countries','any','CountryIso','eq','GB')

如果你想在孙子节点上创建一个谓词:BreezeJS在二级扩展实体上创建谓词

编辑

如果您想获得 ISO 国家/地区以"GB"开头的第一个联系人,您可以通过以下方式实现:

  1. 周杰伦的建议。

  2. 使用 Linq at Breeze 控制器:

    public IQueryable<Person> ContactsWithFilteredCountryIso(string CountryIso)
        {
            return _contextProvider.Context.Persons.Where(p => p.Countries.First().CountryIso== CountryIso);
         }
    

然后在客户端上:

return zEntityQuery.from('Contacts')
        .withParameters({ CountryIso: "GB"})
        .expand('Profile, Countries')
        .orderBy(contactOrderBy)
        .toType(entityName)
        .using(self.manager).execute()
        .to$q(querySucceeded, self._queryFailed);

通过对国家/地区发出 Breeze 查询并扩大联系人,可以对国家/地区进行选择预测:

return zEntityQuery.from('Countries').expand('Contact')
        .select('Country.name')
        .where('CountryIso','eq','GB')
        .orderBy(contactOrderBy)
        .toType(entityName)
        .using(self.manager).execute()
        .to$q(querySucceeded, self._queryFailed);

相关内容

  • 没有找到相关文章

最新更新