1

任意のナビゲーション プロパティで 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 コントローラー内に配置すると、すべて正常に動作します。クライアントで展開を使用せずに使用すると、そのエラーが発生します。どんな助けでも大歓迎です!

これは、データの取得を試みるために使用される 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; }
}

コントローラーは次のようになります (他の 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

4 に答える 4

2

問題は解決しました。Web API での CORS サポートをテストするためにインストールされたプレリリース ソフトウェアがいくつかありました。これらの変更を削除すると、展開が機能するようになりました。助けてくれてありがとう。

于 2013-06-05T15:37:56.527 に答える
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 アセンブリの問題のようです。

于 2013-09-18T11:24:40.010 に答える
0

予選

expand なしMaxsysController.CallOutcomesでエンドポイントをクエリできると確信していますか?

Repository.CallOutcomes適切な EF コンクリート タイプを返していると確信していますか?

コントローラーの内部で次のようなことを試しましたCallOutcomes():

[HttpGet]
    public IQueryable CallOutcomes()
    {
        var foo = Repository.CallOutcomes // ここで区切ります。後で削除します。
                  .Include('CallOutcomeAction').ToList();
        Repository.CallOutcomes を返します。
    }

休憩で、メソッドが失敗せずに成功し、foo値があることを確認しました。

これらの点を確認したら、次は を削除することになると思います[RequireHTTPS]。最近は試していませんが、自分ですばやく設定するのは簡単ではありません。[RequireHTTPS]手違いで属性と属性が干渉している可能性があり[BreezeController]ます。

[RequireHTTPS]の前にも入れてみてください[BreezeController]。それは問題ではありません。私はちょうど今推測しています。ご報告をお待ちしております。

于 2013-06-04T20:56:14.510 に答える
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)"}
于 2013-09-30T09:52:24.930 に答える