我正在尝试将特殊查询组合到Breeze。
我有一个physician.contact.addresses关系。
当我尝试:
myPred = new pred('contact.addresses.street1', op.StartsWith, "a");
执行它我得到:
“属性'地址'的属性访问的父值不是单个值。属性访问只能应用于单个值。”
为了尝试解决方法,我尝试解析那些多关系,并将它传递给.withParameters中的breeze控制器:
var criteriaStr = toManyArray.length ? ko.utils.stringifyJson(toManyArray) : "";
query = query.withParameters({ searchParms: criteriaStr });
其中toManyArray是fieldName:value对的数组。
在控制器端:
[HttpGet]
public IQueryable<Physician> Physician(string searchParms = null)
{
if (searchParms != null)
{
var ser = new JavaScriptSerializer();
var searchCritAry = ser.Deserialize<String[]>(searchParms);
foreach (var aryItem in searchCritAry)
{
// aryItem looks like this:
// f_str_street_from_addresses:a
var predEnt = aryItem.Split(':')[0].Split('_')[4];
var predField = aryItem.Split(':')[0].Split('_')[2];
var predVal = aryItem.Split(':')[1];
switch (predEnt)
{
case "addresses":
switch (predField)
{
case "street":
//physPool =
_contextProvider.Context.Physicians
.Where(p => p.Contact.Addresses.Any(a => a.Street1.StartsWith(predVal)));
break;
case "street2":
//physPool =
_contextProvider.Context.Physicians
.Where(p => p.Contact.Addresses.Any(a => a.Street2.StartsWith(predVal)));
break;
}
break;
}
}
// here I want to combine the .Where clauses from above with the breeze preds
return _contextProvider.Context.Physicians;
}
return _contextProvider.Context.Physicians;
}
它不起作用,只使用通过Breeze查询以正常方式传递的谓词返回选择。我没有看到如何将过滤后的IQueryable传递给Breeze的_contextProvider。
感谢您的任何建议。
答案 0 :(得分:1)
查看Breeze中新的“any / all”支持(从版本1.4.7开始)。可以在此处找到一些示例:http://www.breezejs.com/documentation/query-examples
您可以像这样构建查询/谓词:
var pred = new Breeze.Predicate('contact.addresses', "any", 'street1', op.StartsWith, "a");
var query = EntityQuery.from("Physicians").where(pred);
或只是
var query = EntityQuery.from("Physicians")
.where("contact.addresses", "any", "street1", "startsWith", 'a')
如果您希望同时发送联系人和地址信息,也可以添加展开式广告。
query = query.expand("contact.addresses");
如果您需要嵌套的any / all表达式,您可能需要将以下配置添加到BreezeController以确定允许表达式的深度(下例中为2):
[BreezeController(MaxAnyAllExpressionDepth = 2)]