指定$ filter时出错 {{api}}/Person/Get?$filter=substringof('rid', Name) eq true
{
"$id": "1",
"$type": "System.Web.Http.HttpError, System.Web.Http",
"Message": "An error has occurred.",
"ExceptionMessage": "Exception has been thrown by the target of an invocation.",
"ExceptionType": "System.Reflection.TargetInvocationException",
"StackTrace": " at System.Web.Http.ApiController.<InvokeActionWithExceptionFilters>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()",
"InnerException": {
"$id": "2",
"$type": "System.Web.Http.HttpError, System.Web.Http",
"Message": "An error has occurred.",
"ExceptionMessage": "Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. [.Take[BreezeWithNHiberbate.Model.Person](.OrderBy[BreezeWithNHiberbate.Model.Person,System.Int32](.Where[BreezeWithNHiberbate.Model.Person](NHibernate.Linq.NhQueryable`1[BreezeWithNHiberbate.Model.Person], Quote(($it, ) => (Equal(Equal(Or(Equal(Convert($it.Name), NULL), …Run Code Online (Sandbox Code Playgroud) nhibernate fluent-nhibernate asp.net-mvc-4 asp.net-web-api breeze
我在尝试过滤数据时遇到问题,因为breeze在URL的末尾添加了$ filter子句,而WCF\odata服务正在抛出过滤器,不能在select子句之后.
public IQueryable<order> Orders()
{
string owner= Membership.GetUser(Thread.CurrentPrincipal.Identity.Name).owner;
IQueryable<Consigne> q = this.db.Consignes
// .AddQueryOption("Dest", dest)
.Where(x => x.Owner == owner)
.Select(f => new order{ Name= f.Name, Address1 = f.Address1, Address2 = f.Address2, Address3 = f.Address3 });
return q;
}
Run Code Online (Sandbox Code Playgroud)
我已经使用服务器端Where子句限制结果集,并使用Select投影限制字段.如果我删除这些并让微风完全控制Where\Select然后我吹我的安全模型允许js代码控制.
我意识到这不是一个真正的微风问题而是更多的odata问题,但其他人如何处理这个?你是放弃iQueryable而只是创建一个webapi并传回json?如果是这样,那么我正在重新发明轮子,因为我还需要处理skip\take和orderby.
感谢建议:)亲切的问候,迈克
解决了
我发现WCF无法在不丢失TotalCount的情况下作为iQueryable传递.WCF返回一个QueryOperationResponse,我可以将其传递给breeze,但是一旦通过微风转换为对象,我就无法在Breeze的QueryHelper.WrapResults中找到将动态类型转换回可用对象以检索扩展的TotalCount属性.
QueryHelper将执行查询
queryResult = Enumerable.ToList((dynamic)queryResult)
Run Code Online (Sandbox Code Playgroud)
但
request.Properties.TryGetValue("MS_InlineCount", out tmp)
Run Code Online (Sandbox Code Playgroud)
由于错误的底层对象而失败.
我的解决方案是在我的BreezeController中执行查询,并将行和TotalCount包装在一个数组中,就像Breeze一样.然后我可以将数组作为类型QueryResult传回,breeze将序列化为JSON到客户端.
public QueryResult Consignees(string filter, int skip, int take)
{
WcfService.Context context = new WcfService.Context(new System.Uri(System.Configuration.ConfigurationManager.AppSettings["URI"]));
//Main Table
System.Data.Services.Client.DataServiceQuery<WcfService.Consigne> qMain = context.Consignes.IncludeTotalCount();
//Projected Table
System.Data.Services.Client.DataServiceQuery<Consigne> qProj …Run Code Online (Sandbox Code Playgroud) 我尝试将Breeze与:TypeScript,AMD模块,requirejs,knockout一起使用.
看看Breeze代码,我可以看到它需要通过名称"ko"进行淘汰.但是,还有其他组件需要通过名称"knockout"进行淘汰.
因此,如果我使用路径"knockout"创建requirejs的配置,加载器将抱怨"ko"尚未加载.如果我手动更改Breeze代码,将"ko"替换为"knockout",一切正常.
可以做什么,所以不需要更改Breeze代码?
尝试按照自述文件中的说明运行新项目时收到以下错误.
1:查询Todos
2:查询失败:控制器'BreezeSample'上的动作'Todos',返回类型为'System.Collections.Generic.List`1 [[MyTasks.Api.Models.BreezeSampleTodoItem,MyTasks.Api,Version = 1.0.0.0,Culture =中性,PublicKeyToken = null]]'不能支持查询.确保返回内容的类型是IEnumerable,IQueryable或任一接口的通用形式.
更新:
我检查了我的事件查看器,并在我的机器上尝试调试时看到了我以前从未见过的SQL错误 -
用户'my-machine\user-name'登录失败.原因:无法打开显式指定的数据库.[客户:]
由于某些原因,BreezeSamplesContext生成的数据库似乎无法访问?它是由代码优先生成的,但我无法查询它(显然).
更新2:
我已将默认方法更改为 -
[HttpGet]
public IQueryable<BreezeSampleTodoItem> Todos()
{
System.Data.Entity.DbSet<BreezeSampleTodoItem> result = null;
try
{
result = _contextProvider.Context.Todos;
}
catch (Exception exc)
{
throw new Exception(exc.Message);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
尽管Seed方法有效,并且数据库被删除并使用种子值重新填充,但我在上面的"结果"中得到了0项的响应.
我们通过metadataStore设置breeze元数据,我们现在使用这种方法已有好几个月了.但是前几天我们意识到即使我们使用metadataStore来设置元数据,breeze也会向服务器发出请求以获取元数据 - 它没有让这个请求返回几个版本(我不确定哪个版本,但我可以追溯) .我编写了一个T4模板以生成略微修改的元数据,但是breeze不使用它,总是从服务器加载元数据并覆盖我的.
这是我们如何设置元数据;
var core = breeze.core,
entityModel = breeze.entityModel,
serviceName = 'api/Service',
metadataStore = new entityModel.MetadataStore();
metadataStore.importMetadata($.toJSON(metadata));
var createManager = function () {
return new entityModel.EntityManager({
serviceName: serviceName,
metadataStore: metadataStore
});
};
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我在VS 2013中使用Angular.js和HotTowel以及Breeze进行SPA项目.它在我的开发机器上工作正常但是当我在运行Windows Server 2012的Web服务器上将其部署到IIS 8.0时,它失败了.框架加载但不加载我的默认视图.它只是闪烁启动页面并显示一个空的浏览器.
我可以使用开发人员工具浏览js代码,但它从未将我的默认视图加载到index.html中.
使用IE中的开发人员工具,我在config.route.js中设置断点,以完成确定将加载到SPA中的页面的过程.它似乎正在提出正确的页面.应该加载的页面称为request.html,因此我还在request.js中放置了一个断点,以查看它是否在加载时失败.它永远不会打到这个断点.
我希望在向IIS部署SPA时,可能有人遇到过这些相同或类似的问题.
感谢您提供的任何帮助.与此同时,我会继续寻找.
JG
我想在breeze dataService(客户端)中获取下面提到的自定义属性.
namespace Tam.Framework.Web.Models
{
[ViewAttribute("app/views/Employee.html")]//this custom class attribute
public class Employee : BaseEntity
{
protected override string OnGetDescriptor()
{
return "some description";
}
public string FirstName { get; set; }
[Display(Name = "LAST NAME")]//this custom property attribute
public string LastName { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud) breeze ×7
amd ×1
angularjs ×1
attributes ×1
iis ×1
javascript ×1
knockout.js ×1
nhibernate ×1
odata ×1
requirejs ×1