Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BreezeJs:错误:无法将此终结点转换为IQueryable_Breeze - Fatal编程技术网

BreezeJs:错误:无法将此终结点转换为IQueryable

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;

我有一个asp.NETCore1.1.0项目,正在尝试CodeCamp示例的模型。在本例中,我们使用一个控制器,该控制器返回查找数据,如下所示:

[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.cs
ConfigureServices
方法中。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>&nbsp;&nbsp;&nbsp;&nbsp;\"where\":{" +
                                "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"Status\":123," +
                                "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"Cost\":{" +
                                "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"lt\":10" +
                                "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}" +
                                "<br>&nbsp;&nbsp;&nbsp;}," +
                                "<br>&nbsp;&nbsp;&nbsp;\"select\":[" +
                                "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"OrderId\"," +
                                "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"OrderDateTime\"" +
                                "<br>&nbsp;&nbsp;&nbsp;]" +
                                "<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); } } }