Breeze Expand Property

时间:2013-06-04 18:13:06

标签: breeze

当我尝试在任何导航属性上使用Expand时,我收到以下异常。

    $id: "1",
    $type: "System.Web.Http.HttpError, System.Web.Http",
    Message: "An error has occurred.",
    ExceptionMessage: "'object' does not contain a definition for 'Include'",
    ExceptionType: "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException",
    StackTrace: " at System.Web.Http.ApiController.<InvokeActionWithExceptionFilters>d__b.MoveNext() --- End of stack trace from previous  location where exception was thrown --- at  System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 

如果我将包含在Breeze控制器中,一切正常。如果我不这样做,只需在客户端上使用expand,我就会收到错误。非常感谢任何帮助!

这是用于尝试检索数据的URL

   /breeze/maxsys/CallOutcomes?$expand=CallOutcomeAction

这是模型

[Table("CallOutcomes")]
public class CallOutcome {
    [Key]
    public int Id { get; set; }

    [Required]
    public string Description { get; set; }
    public bool IsInternal { get; set; }


    public int CallOutcomeActionId { get; set; }

    [ForeignKey("CallOutcomeActionId")]
    [InverseProperty("CallOutcomes")]
    public CallOutcomeAction CallOutcomeAction { get; set; }
    public ICollection<CallOutcomeHistory> CallOutcomeHistories { get; set; }
}

Controller看起来如下(我删除了一些其他get方法)

[BreezeController]
[Authorize]
[RequireHttps]
public class MaxsysController : ApiController

    protected IMaxsysBreezeRepository Repository { get; set; }

    public MaxsysController(IMaxsysBreezeRepository repository)
    {
        Repository = repository;
    }

    [HttpGet]
    public IQueryable<CallOutcome> CallOutcomes()
    {
        return Repository.CallOutcomes;
    } 
}

错误来自BreezeQueryableAttribute.cs中的此方法

    public virtual IQueryable ApplyExpand(IQueryable queryable, string expandsQueryString, HttpRequestMessage request)
    {
        (from s in expandsQueryString.Split(new char[] { ',' }) select s.Trim()).ToList<string>().ForEach(delegate (string expand) {
            queryable = (IQueryable) ((dynamic) queryable).Include(expand.Replace('/', '.'));
        });
        return queryable;
    }

参数值为

   queryable = {SELECT 
[Extent1].[Id] AS [Id], 
N'b1d28373-98a2-4a88-9733-7872acd28bd2' AS [C1], 
[Extent1].[Description] AS [Description], 
[Extent1].[IsInternal] AS [IsInternal], 
[Extent1].[CallOutcomeActionId] AS [CallOutcomeActionId], 
N'CallOutcomeAction' AS [C2], 
N'b1d28373-98a2-4a88-9733-7872acd28bd2' AS [C3], 
[Extent2].[Id] AS [Id1], 
[Extent2].[Description] AS [Description1]
FROM  [dbo].[CallOutcomes] AS [Extent1]
INNER JOIN [dbo].[CallOutcomeActions] AS [Extent2] ON [Extent1].[CallOutcomeActionId] = [Extent2].[Id]}

expandsQueryString = "CallOutcomeAction"

    HttpRequestMessage ={Method: GET, RequestUri: 'http://127.0.0.1:82/breeze/maxsys/CallOutcomes?$expand=CallOutcomeAction', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Connection: keep-alive
  Accept: text/html
  Accept: application/xhtml+xml
  Accept: application/xml; q=0.9
  Accept: */*; q=0.8
  Accept-Encoding: gzip
  Accept-Encoding: deflate
  Accept-Encoding: sdch
  Accept-Language: en-US
  Accept-Language: en; q=0.8
  Host: 127.0.0.1:81
  User-Agent: Mozilla/5.0
  User-Agent: (Windows NT 6.1; WOW64)
  User-Agent: AppleWebKit/537.36
  User-Agent: (KHTML, like Gecko)
  User-Agent: Chrome/27.0.1453.94
  User-Agent: Safari/537.36
}}

4 个答案:

答案 0 :(得分:2)

问题解决了。安装了一些预发布软件来测试Web API中的CORS支持。删除这些更改后,展开工作。谢谢你的帮助。

答案 1 :(得分:1)

我也遇到过这个问题,并将其追溯到BreezeQueryable注释的应用程序。

例外:

ExceptionMessage:“'System.Linq.EnumerableQuery'不包含'Include'的定义”,

端点:

[HttpGet]
[BreezeQueryable(PageSize = 1000)] //1000 row limit
public IQueryable<Postcode> Postcodes()
{
    return _db.Context.Postcodes;
}

调用脚本:

var qry = breeze.EntityQuery
                .from('Postcodes')
                .where('Name', breeze.FilterQueryOp.StartsWith, searchTerm)
                .orderBy('PostcodeId')
                .expand('State')
                .take(25);

要修复,只需删除[BreezeQueryable]注释:

[HttpGet]
//[BreezeQueryable(PageSize = 1000)] //1000 row limit
public IQueryable<Postcode> Postcodes()
{
    return _db.Context.Postcodes;
}

编辑 - 显然这不是'固定'。 看起来像是Breeze WebApi程序集中的一个问题。

答案 2 :(得分:0)

预备

您确定可以在不展开的情况下查询MaxsysController.CallOutcomes端点吗?

你确定Repository.CallOutcomes正在返回正确的EF混凝土类型吗?

您在控制器CallOutcomes()内尝试了以下内容:

[HttpGet]
    public IQueryable CallOutcomes()
    {
        var foo = Repository.CallOutcomes  // break here; remove later.
                  .Include('CallOutcomeAction').ToList();
        return Repository.CallOutcomes;
    } 

在休息时你已经确认该方法没有成功,而foo有值。

下一步

一旦你确认了这些点数,我认为我的下一步行动就是删除[RequireHTTPS]。我最近没有尝试过,而且我不容易在我的结尾快速设置它。我们可能会搞砸,[RequireHTTPS]属性和[BreezeController]属性之间存在干扰。

另请尝试在[RequireHTTPS]之前加[BreezeController]。没关系;我现在只是猜测。我等待你的报告然后我们可以从那里继续前进。

答案 3 :(得分:0)

当我尝试使用操作上的BreezeQueryableAttribute限制我的操作返回的页面大小时,我开始遇到此问题。如果没有该属性,操作将返回预期的数据。和gopheruk一样,我相信Breeze目前存在一个错误。

图书馆版本:

使用任何预发布库,一切都在nuget中是最新的。

  • Breeze 1.4.2(Breeze.WebApi 1.4.0.0,Breeze.WebApi.EF 1.4.0.0)
  • Microsoft.AspNet.WebApi 4.0.30506
  • EntityFramework 5.0.0

请求:

http://localhost/breeze/Data/MyObjects?$filter=Id%20eq%201&$expand=User

在服务器上:

[BreezeController]
public class DataController : ApiController
{

    //...

    [HttpGet]
    [BreezeQueryable(PageSize = 30)] //if this line is commented out, everything works
    public IQueryable<MyObject> MyObjects()
    {
        return _myObjectRepository.All(User.Identity);
    }

}

回复:

{"$id":"1","$type":"System.Web.Http.HttpError, System.Web.Http","Message":"An error has occurred.","ExceptionMessage":"'System.Linq.EnumerableQuery<MyObject>' does not contain a definition for 'Include'","ExceptionType":"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException","StackTrace":"   at CallSite.Target(Closure , CallSite , Object , String )\r\n   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)\r\n   at Breeze.WebApi.QueryHelper.<>c__DisplayClass14.<ApplyExpand>b__11(String expand)\r\n   at System.Collections.Generic.List`1.ForEach(Action`1 action)\r\n   at Breeze.WebApi.QueryHelper.ApplyExpand(IQueryable queryable, String expandsQueryString)\r\n   at Breeze.WebApi.QueryHelper.ApplySelectAndExpand(IQueryable queryable, NameValueCollection map)\r\n   at Breeze.WebApi.BreezeQueryableAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n   at System.Web.Http.Filters.ActionFilterAttribute.CallOnActionExecuted(HttpActionContext actionContext, HttpResponseMessage response, Exception exception)\r\n   at System.Web.Http.Filters.ActionFilterAttribute.<>c__DisplayClass2.<System.Web.Http.Filters.IActionFilter.ExecuteActionFilterAsync>b__0(HttpResponseMessage response)\r\n   at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass41`2.<Then>b__40(Task`1 t)\r\n   at System.Threading.Tasks.TaskHelpersExtensions.ThenImpl[TTask,TOuterResult](TTask task, Func`2 continuation, CancellationToken cancellationToken, Boolean runSynchronously)"}