BreezeJs:错误:无法将此终结点转换为IQueryable
我有一个asp.NETCore1.1.0项目,正在尝试CodeCamp示例的模型。在本例中,我们使用一个控制器,该控制器返回查找数据,如下所示:BreezeJs:错误:无法将此终结点转换为IQueryable,breeze,Breeze,我有一个asp.NETCore1.1.0项目,正在尝试CodeCamp示例的模型。在本例中,我们使用一个控制器,该控制器返回查找数据,如下所示: [BreezeController] public class BreezeController : ApiController { [HttpGet] public object Lookups() { var rooms = _repository.Rooms; var tracks = _repository.Tracks;
[BreezeController]
public class BreezeController : ApiController
{
[HttpGet]
public object Lookups()
{
var rooms = _repository.Rooms;
var tracks = _repository.Tracks;
var timeslots = _repository.TimeSlots;
return new { rooms, tracks, timeslots };
}
在dataContext.js中调用上述查找,如下所示:
function getLookups() {
return EntityQuery.from('Lookups')
.using(manager).execute()
.to$q(querySucceeded, _queryFailed);
function querySucceeded(data) {
log('Retrieved [Lookups]', data, true);
return true;
}
}
现在,我正试图在我的项目中遵循上述步骤,其给我的错误如下:
获取500(内部服务器错误)
未兑现(承诺)
错误:无法将此端点转换为IQueryable
以上问题的任何解决方案……在John Papa的Code camper项目中都可以正常工作。如果我在浏览器中运行web api查找代码,但不在breezejs中运行,则该代码工作正常。Breeze的.NET核心实现需要一个隐藏的第一个参数。它使用它来执行REST操作的IQueryable筛选。例如,如果您的操作如下所示:
[HttpGet]
public IQueryable<Order> Orders()
{
"where":{
"Status":123,
"Cost":{
"lt":10
}
},
"select":[
"OrderId"
]
}
GetOrdersByStatusAndLessThanCost?status=123&cost=10
这与以前的版本有很大不同。通过添加以下内容,可以将客户端更改为传递与此兼容的参数:
breeze.config.initializeAdapterInstance("uriBuilder", "json");
我将此添加到我的fetchMetadata调用中
但是,如果您有带参数的特定get方法,并且希望从Swagger或其他应用程序调用它,那么这会导致很多问题
大概是这样的:
[HttpGet]
public IQueryable<Order> GetOrdersByStatusAndLessThanCost(int status, int cost)
Breeze假设第一个参数(status=123)是它的JSON。所以它试图把它解析出来
这给出了将Breeze迁移到.NET Core时的第一个最常见错误:
此EntityQuery需要有效的json字符串。以下不是json:status=123
如果您碰巧传入了Json,但结果不是IQueryable,则会出现以下错误:
无法将此终结点转换为IQueryable
所有这些的关键是给breeze它想要的东西。对于上面的示例,以下URL将起作用:
GetOrdersByStatusAndLessThanCost?{}&status=123&cost=10
注意,添加了{}&
作为第一个参数。这告诉breeze,就过滤而言,没有任何期望
要使Swashback(扩展为Swagger\Open API)能够使用此方法,请将其添加到对服务的调用中的Startup.csConfigureServices
方法中。AddSwaggerGen(c=>
:
c.OperationFilter<AddBreezeParameter>();
c.操作过滤器();
然后创建所需的文件:
public class AddBreezeParameter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (context.MethodInfo.ReturnType.Name.StartsWith("IQueryable"))
{
if (operation.Parameters == null)
{
operation.Parameters = new List<OpenApiParameter>();
}
var exampleString = "<br>\":{}," +
"<br> \"where\":{" +
"<br> \"Status\":123," +
"<br> \"Cost\":{" +
"<br> \"lt\":10" +
"<br> }" +
"<br> }," +
"<br> \"select\":[" +
"<br> \"OrderId\"," +
"<br> \"OrderDateTime\"" +
"<br> ]" +
"<br>}";
var breezeJsonParam = new OpenApiParameter
{
Name = "{\"breezeJson",
In = ParameterLocation.Query,
AllowEmptyValue = true,
Description =
"Json used to query a REST resource. <br>Due to Breeze's nonstandardness and Swashbuckle's not able to customize to allow for it, this MUST start with \":{} and end with } In between those you can put your query if it is appropriate. If you do you must add a comma after the starting value and before you value. Here is an example: " +
exampleString,
AllowReserved = true
};
var schema = new OpenApiSchema {Type = "json", Default = new OpenApiString("\":{}}")};
breezeJsonParam.Schema = schema;
operation.Parameters.Insert(0, breezeJsonParam);
}
else
{
if (operation.Parameters == null)
{
operation.Parameters = new List<OpenApiParameter>();
}
var breezeJsonParam = new OpenApiParameter();
// Breeze looks for the first parameter so it can do an IQueryable Filter on it.
// We want it to not have anything for that parameter if it is not an IQueryable.
breezeJsonParam.Name = "{}&";
breezeJsonParam.In = ParameterLocation.Query;
breezeJsonParam.Description = "Do NOT modify this parameter. (It is here for Breeze compatibility.)";
var schema = new OpenApiSchema {Example = new OpenApiString(" ")};
//var schema = new OpenApiSchema {Type = "string", Default = new OpenApiString("\":{}}")};
breezeJsonParam.Schema = schema;
operation.Parameters.Insert(0, breezeJsonParam);
}
}
}
公共类AddBreezeParameter:IOperationFilter
{
公共无效应用(OpenApiOperation操作,OperationFilterContext上下文)
{
if(context.MethodInfo.ReturnType.Name.StartsWith(“IQueryable”))
{
if(operation.Parameters==null)
{
operation.Parameters=newlist();
}
var exampleString=“
\”:{}+
“
\”其中\:{”+
“
状态\”:123,”+
“
成本\:{”+
“
\“lt\”:10”+
“
}”+
“
}”+
“
\”选择\:[”+
“
订单ID\,”+
“
订单日期时间”+
“
]”+
“
}”;
var breezeJsonParam=新的openapi参数
{
Name=“{\”breezeJson”,
In=ParameterLocation.Query,
AllowEmptyValue=true,
描述=
Json用于查询REST资源。
由于Breeze的非标准性和Swashback无法自定义以允许它,因此必须以\“:{}开头,以}结尾。如果合适,可以将查询放在两者之间。如果这样做,则必须在起始值之后和值之前添加逗号。以下是一个示例:+
例如字符串,
Allowre=true
};
var schema=new OpenApiSchema{Type=“json”,默认值为new OpenApiString(“\”:{}”)};
breezeJsonParam.Schema=Schema;
operation.Parameters.Insert(0,breezeJsonParam);
}
其他的
{
if(operation.Parameters==null)
{
operation.Parameters=newlist();
}
var breezeJsonParam=新的OpenApiParameter();
//Breeze查找第一个参数,以便对其执行IQueryable过滤器。
//如果它不是IQueryable,我们希望它不包含该参数的任何内容。
breezeJsonParam.Name=“{}&”;
breezeJsonParam.In=ParameterLocation.Query;
breezeJsonParam.Description=“请勿修改此参数。(此参数用于与Breeze兼容。)”;
var schema=new OpenApiSchema{Example=new OpenApiString(“”};
//var schema=new OpenApiSchema{Type=“string”,默认值为new OpenApiString(“\”:{}”)};
breezeJsonParam.Schema=Schema;
operation.Parameters.Insert(0,breezeJsonParam);
}
}
}