Breeze可以解决多值属性查询问题

时间:2013-12-23 23:55:01

标签: c# linq search breeze

我正在尝试将特殊查询组合到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。

感谢您的任何建议。

1 个答案:

答案 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)]