【问题标题】:Why does my OData v4 API work for ?$filter=contains, but not ?$filter=field eq 'val'?为什么我的 OData v4 API 适用于 ?$filter=contains,但不适用于 ?$filter=field eq 'val'?
【发布时间】:2020-10-16 22:22:29
【问题描述】:

我编写了一些 OData V4 API 来从本地 SQL 数据库中提取数据。我正在使用 curl 来查询 API。 API 是 ASP.NET 并部署在 IIS 服务器上。

如果我像这样查询我的 OData API,我会得到正确的数据:

IPADDRESS/cdi_unsubscribes?$filter=contains(cdi_email,'info@')

但是,如果我使用这样的 eq 过滤器查询我的 OData:

IPADDRESS/cdi_unsubscribes?$filter=cdi_email eq 'info@email.com'

我收到以下错误消息:

"message":"URI 中指定的查询无效。$filter 表达式必须计算为单个布尔值。"

然后 curl 输出:

curl: (6) 无法解析主机:eq

curl: (6) 无法解析主机:email.com'

我不明白为什么会这样。

我的 WebApiConfig:

public static void Register(HttpConfiguration config)
    {
        ODataModelBuilder builder = new ODataConventionModelBuilder();

        config.AddODataQueryFilter();
        config.Select().Expand().Filter().OrderBy().MaxTop(null).Count().SkipToken();

        builder.EntitySet<cdi_unsubscribe>("cdi_unsubscribes");
        builder.EntityType<cdi_unsubscribe>().Filter("cdi_email");

        builder.EntitySet<Product>("Products");

        config.MapODataServiceRoute("ODataRoute", null, builder.GetEdmModel());
    }

我添加了 2 行以确保过滤适用于该字段上的特定实体。删除一个并不能解决此问题。

我的控制器类:

[HttpBasicAuthorize]
[RequireHttps]
public class cdi_unsubscribesController : ODataController
{
    cdi_unsubscribesContext db = new cdi_unsubscribesContext();

    private bool cdi_unsubscribeExists(Guid key)
    {
        return db.cdi_unsubscribes.Any(p => p.id.Equals(key));
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }

    [EnableQuery]
    public IQueryable<cdi_unsubscribe> Get()
    {
        return db.cdi_unsubscribes;
    }

    [EnableQuery]
    public SingleResult<cdi_unsubscribe> Get([FromODataUri] Guid key)
    {
        IQueryable<cdi_unsubscribe> result = db.cdi_unsubscribes.Where(p => p.id.Equals(key));
        return SingleResult.Create(result);
    }

我的上下文类:

public class cdi_unsubscribesContext : DbContext
{
    public cdi_unsubscribesContext() : base("name=cdi_unsubscribesContext")
    {

    }
    public DbSet<cdi_unsubscribe> cdi_unsubscribes { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("crm");
    }
}

我的实体定义:

public class cdi_unsubscribe
{
    public Guid id { get; set; }
    public Nullable<int> statecode { get; set; }
    public Nullable<int> statuscode { get; set; }
    public String cdi_email { get; set; }
    public Nullable<Guid> _cdi_contactid_value { get; set; }
    public String cdi_subscriptionchannel { get; set; }
    public Nullable<DateTime> createdon { get; set; }
}

我错过了什么明显的东西吗?我原以为如果 contains 可以完美运行,那么基本的 eq 过滤器应该可以正常工作。我的第一个猜测是我没有正确编写我的 eq 过滤器,但是我在网上看到的每个示例看起来都和我的一样(除非我是盲人!)。

【问题讨论】:

    标签: asp.net odata


    【解决方案1】:

    原来 curl 是问题所在!

    像这样用 %20 替换空格:

    IPADDRESS/cdi_unsubscribes?$filter=cdi_email%20eq%20'info@email.com'
    

    工作。

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2015-07-31
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多