【问题标题】:Breeze work-around for multi valued property queries多值属性查询的 Breeze 解决方法
【发布时间】:2013-12-23 23:55:01
【问题描述】:

我正在尝试将临时查询组装到 Breeze。

我有一个医生.联系人.地址关系。

当我尝试时:

myPred =  new pred('contact.addresses.street1', op.StartsWith, "a");

然后执行我得到:

“属性“地址”的属性访问的父值不是单个值。属性访问只能应用于单个值。”

为了尝试解决方法,我尝试解析出那些多关系并将其传递给 .withParameters 中的微风控制器,如下所示:

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。

感谢您的任何建议。

【问题讨论】:

    标签: c# linq search breeze


    【解决方案1】:

    看看 Breeze 中新的“任何/全部”支持(从 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");
    

    如果您需要嵌套任何/所有表达式,您可能需要将以下配置添加到您的 BreezeController 以确定您希望允许表达式的深度(下面示例中的 2):

    [BreezeController(MaxAnyAllExpressionDepth = 2)]
    

    【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2014-01-12
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多