使用System.Linq.Dynamic选择Clause返回"'(' expect" fault

时间:2017-07-05 00:20:50

标签: c# linq linq-to-sql dynamic-linq

我试图使用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;

}

谢谢!

1 个答案:

答案 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在视图模型中设置一个布尔标志,并且它有效。但要注意的是“外部”引用的内容。