我试图使用linq dynamic来创建一个返回特定对象的选择。但我总是得到相同的错误消息:'('期待
我的选择代码:
@Component({
template: `
<input *ngFor="let input of dialog.inputs" [value]="input.value">
`
})
export class WhateverComponent{
public dialog:IDialog = {
inputs:[
{label:'OK', value:'OK'},
{label:'Cancel', value:'Cancel'}
]
};
}
export interface IDialog{
inputs: Array<iSomeControl | string >;
}
export interface iSomeControl{
label: string;
value: string;
}
谢谢!
答案 0 :(得分:1)
你的例子中的主要问题是“什么是外部?” ( @ 1.Contains(outerIt.Id))这看起来只是一个更大的查询。您可能想要发布完整的表达集。
基于对您所看到的内容的假设:可能在单个Linq语句中,但在查看模型和本机.Net方法/结构时,我经常会遇到Linq2Entities / Linq2SQL的奇怪主义所以我倾向于默认选择单独的数据到结束格式。
var resultCollection = manyPartEntireCollection
.Select( x => new { ManyPartId = x.Id, x.Name })
.ToList()
.Select( x => new OneToManyViewModel
{
OnePartId = onePartId,
ManyPartId = x.ManyPartId,
Name = x.Name,
IsEnabled = manyPartIds.Contains(x.ManyPartId)
}).ToList();
关于这样的代码的警告:最初您可能拥有合理数量的数据,但在未来的道路上,您将遇到.ToList()表达式的潜在性能和资源问题。 (项目数没有上限。)
更新:如果需要DynamicLinq,那么您可以在此线程上实现dahlbyk提供的解决方案:System.LINQ.Dynamic: Select(" new (...)") into a List<T> (or any other enumerable collection of <T>)
System.Linq.Dynamic的源代码可以在这里找到:https://github.com/meatGUY/System.Linq.Dynamic(更新为meatGUY fork,因为它看起来更新了)
我已经在这里创建了一个带有此实现的fork:https://github.com/StevePy/System.Linq.Dynamic我将点击一个pullGUY的pull请求,看看是否值得合并。
我做了修改,似乎做了你所期望的。不知道为什么没有正式合并,因为它有点意义。 :)
他的说明很容易遵循,你最终会得到一个看起来像这样的电话:
var resultCollection = manyPartEntireCollection
.Select<OneToManyViewModel>("new (@0 as OnePartId, Id as ManyPartId, Name as Name, @1.Contains(outerIt.Id) as Enable)", onePartId, manyParIds)
.ToList();
我用类似的对象模型测试它,使用Contains在视图模型中设置一个布尔标志,并且它有效。但要注意的是“外部”引用的内容。