【发布时间】: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 过滤器,但是我在网上看到的每个示例看起来都和我的一样(除非我是盲人!)。
【问题讨论】: