【发布时间】:2015-01-19 01:26:50
【问题描述】:
我有一种情况需要为子实体带来自定义数据以及他们父母的一些属性。这是我的代码:
型号:
public class InvoiceHeader
{
public int Id { get; set; }
public short LocationId { get; set; }
public DateTime EntryDate { get; set; }
// some other properties
public Location Location { get; set; }
}
public class InvoiceItemsDto
{
public int Id { get; set; }
public int InvoiceHeaderId { get; set; }
public string ProductName { get; set; } // Not mapped
// some other properties
// Added to get the headers entry date and location:
public short LocationId { get; set; } // Not mapped
public DateTime EntryDate { get; set; } // Not mapped
}
控制器:
[HttpGet]
public IQueryable<InvoiceItemsDto> InvoiceItemsHeaders()
{
return _contextProvider.Context.InvoiceItems.Select(a => new InvoiceItemsDto()
{
Id = a.Id,
HeaderId = a.HeaderId,
// Some Other properties
ProductName = a.Product.ProductName,
EntryDate = a.InvoiceHeader.EntryDate,
LocationId = a.InvoiceHeader.LocationId
});
}
Javascript:
metadataStore.registerEntityTypeCtor(
'InvoiceItems',InvoiceItemInit , InvoiceItemInitializer);
// Here goes the unmapped properties
function InvoiceItemInit() {
this.ProductName = "";
this.LocationId = 0;
this.EntryDate = new Date();
}
// For Css styling only:
function InvoiceItemInitializer(Item) {
Item.isSelected = ko.observable(false);
Item.isDeleted = ko.observable(false);
Item.focused = ko.observable(false);
}
// Action:
var locationId_p = Predicate.create('LocationId', '==', locationId());
var dateFrom_p = Predicate.create('EntryDate', '>=', dateFrom().toJSON()); // throws an error.
var dateTo_p = Predicate.create('EntryDate', '<=', dateTo().toJSON()); //throws an error.
var ProductName_p = Predicate.create('ProductName', 'contains', productName()); // throws an error.
var whereClause = locationId_p.and(dateFrom_p).and(dateTo_p).and(ProductName_p);
var query = EntityQuery.from('InvoiceItemsHeaders').toType(entityNames.invoiceItem)
.where(whereClause)
.skip(skipPage * 50)
.take(50)
.orderBy('headerId')
.inlineCount(true);
;
错误是JSON 序列化内容(例如,ProductName 没有被 %27% 包围,我认为这是一个字符串指示符)
将谓词的代码更改为:
var dateFrom_p = Predicate.create('EntryDate', '>=', "datetime'" + dateFrom().toJSON() + "'");
var dateTo_p = Predicate.create('EntryDate', '<=', "datetime'" + dateTo().toJSON() + "'");
var ProductName_p = Predicate.create('ProductName', 'contains', "'" + productName() + "'");
有效.. 但是,这不适用于映射属性,因为它们被正确地 JSON 化了..
还有其他方法可以解决这个未映射的日期和字符串吗?
编辑:
我已编辑原始帖子以更正(仅)Pascal 和骆驼案例 (我的坏)
澄清一下:
谓词中提到的所有属性都未映射 即
LocationId、ProductName和EntryDate这就是为什么它们必须使用 PascalCase。我遇到的问题是关于这些属性的谓词(
LocationId(int 类型)除外)locationId()、dateFrom()、dateTo()和productName()是用户输入/选择的 observables 值-
使用以下谓词执行查询:
Predicate.create('EntryDate', '>=', dateFrom()); Predicate.create('EntryDate', '<=', dateTo());
导致以下错误:
"')' or operator expected at position 65 in '(((LocationId eq 1) and (EntryDate ge Mon Feb 02 2009 00:00:00 GMT+0300 (Arab Standard Time))) and (EntryDate le Sun Jan 18 2015 04:04:46 GMT+0300 (Arab Standard Time))'."
生成的网址:
http://localhost:8743/breeze/breeze/InvoiceItemsHeaders?$filter=(((LocationId%20eq%201)%20and%20(EntryDate%20ge%20Mon%20Feb%2002%202009%2000%3A00%3A00%20GMT%2B0300%20(Arab%20Standard%20Time)))%20and%20(EntryDate%20le%20Sun%20Jan%2018%202015%2003%3A18%3A28%20GMT%2B0300%20(Arab%20Standard%20Time))&$orderby=HeaderId&$top=50&$inlinecount=allpages
附:我没有在 datetime 类型的映射属性上收到此错误,所有(映射或未映射的)属性值都来自已知的 jquery 日历,供用户选择所需的日期。
所以我不得不使用toJson() 以适当的Json 格式修复datetime 格式:
console.log(dateFrom());// Mon Feb 02 2009 00:00:00 GMT+0300 (Arab Standard Time)
console.log(dateFrom().toJSON());// 2009-02-01T21:00:00.000Z
我欺骗了来自 datetime 类型映射属性的谓词的正确 url,然后我必须想出以下内容才能使查询正常工作:
Predicate.create('EntryDate', '>=', "datetime'" + dateFrom().toJSON() + "'");
Predicate.create('EntryDate', '<=', "datetime'" + dateTo().toJSON() + "'");
至于字符串类型的其他未映射属性ProductName,场景有点不同,使用以下谓词运行:
Predicate.create('ProductName', 'contains', productName());
结果:
错误信息:
"Could not find a property named 'abc' on type 'BreezeProj.InvoiceItemsDTO'"
网址:
http://localhost:8743/breeze/breeze/InvoiceItemsHeaders?$filter=(substringof(abc%2CProductName)%20eq%20true)
这里的'abc'是一个传递给ProductName()的值
再次,我必须提出以下查询才能正常工作:
Predicate.create('ProductName', 'contains', "'" + productName() + "'");
有什么想法吗? 谢谢
我对 Ward 的第二次修改的回应:
InvoiceItems是entityType,在数据库中是这样命名的,我用InvoiceItemsDto
作为获取所需属性的视图。我可以简单地将InvoiceHeader 扩展为EntryDate 和Location 或Product 扩展为ProductName
但是我会发现自己在客户端多次扩展许多其他导航属性,这很麻烦。
EntryDate - 例如 - 是映射到 InvoiceItemsDto 但不映射到应计实体 InvoiceItems 的属性,因此,entityNames.invoiceItem 是 InvoiceItems
发布上面的整个代码并不意味着我希望你被卷入我的应用程序的漩涡中。
也许我缺乏清除意图的能力,但是 我的问题确实很小而且很集中“为什么 Breeze 在查询结果中实现了谓词时没有实现带有谓词的“未映射”属性的数据类型?”
无论如何,这里是您请求的元数据的链接:
再次,抱歉给您带来不便。
【问题讨论】:
标签: breeze