代码之家  ›  专栏  ›  技术社区  ›  Rush Frisby

就像在OData查询中一样

  •  2
  • Rush Frisby  · 技术社区  · 14 年前

    我正在将一个项目从使用linq2sql转换为使用odata源。我正试图查找这样的用户…

    FrameworkEntities db = new FrameworkEntities(
        new Uri("http://localhost/odata/FrameworkService.svc"));
    User user = db.Users.Where(
        u => SqlMethods.Like(u.UserName, UserName)).FirstOrDefault();
    

    但现在出现的错误是“method”boolean like(system.string,system.string)'不能在客户端上使用;它只用于转换为SQL。“这在linq2sql中是可能的,所以我想知道如何更改它,以便它可以与odata服务一起使用。我没有找到任何关于它的文章。

    3 回复  |  直到 9 年前
        1
  •  2
  •   Justin Niessner    14 年前

    正如错误所说,sqlmethods.like()用于转换为SQL。OData查询无法转换为SQL,因此无法使用该方法。您最好的选择是使用indexof和 StringComparison.InvariantCultureIgnoreCase 模拟不区分大小写的 String.Contains .

    哦……你可以把你的电话组合到 Where FirstOrDefault :

    User user = db.Users
                  .Where(u => u.UserName.IndexOf(Username, 
                      StringComparison.InvariantCultureIgnoreCase) > 0)
                  .FirstOrDefault();
    
        2
  •  0
  •   Daniel Przybylski    10 年前

    odata不包含函数的子字符串。对于我最近工作的一个小项目,我担心数据模型的三个属性中是否存在类似字符串的数据。

    $filter=(IN_OUT eq '0' and (substringof('D20033', toupper(BENEFICIARY)) or substringof('D20033', toupper(ORIGINATOR)) or substringof('D20033', toupper(MEMO))))
    

    我还在模型属性周围使用了toupper函数,并将表单输入搜索字符串大写,以便进行不区分大小写的搜索。所以在这里,我担心在三个领域中的一个或多个领域,受益人、发起人或备忘录中,“0”和“d20033”。

        3
  •  0
  •   Rahul    9 年前

    或者,可以在OData中使用“startswith”筛选器表达式。

    例子:

        var query = context.Users;
        query = query.AddQueryOption("$filter", String.Format("UserName startswith {0}", UserName));
        Users sers = new DataServiceCollection<User>(query);
    

    这将生成这样的URI: http://localhost:7048/OData/Users ?$filter=username开始使用'obama'

    参考文献: https://msdn.microsoft.com/en-us/library/hh169248(v=nav.80).aspx