我正在使用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')
在微风的位置(谓词)中可以表达类似的东西吗?我想走另一条路(从中间表开始并从那里过滤),但不确定这是否是正确的方法。
使用关键字 any
或 all
创建谓词来实现这一点
.where('Countries','any','CountryIso','eq','GB')
如果你想在孙子节点上创建一个谓词:BreezeJS在二级扩展实体上创建谓词
编辑
如果您想获得 ISO 国家/地区以"GB"开头的第一个联系人,您可以通过以下方式实现:
周杰伦的建议。
使用 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);