当我尝试在任何导航属性上使用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
}}
答案 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中是最新的。
请求:
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)"}