Linq查询IReliableDictionary

时间:2016-05-10 14:20:26

标签: c# linq azure-service-fabric

我已经做了很多寻找和搞乱代码,我还没有找到一种方法来对export class DynamicForm implements OnInit { data:Data; formModel:ControlGroup; constructor(private fb:FormBuilder) { this.formModel = fb.group({ heading: fb.control('test heading', Validators.required), entries: fb.array([]) }) } ngOnInit():void { /* init the heading */ this.data = new Data('test heading'); /* init the entries > add to model, create control and add it to ControlArray */ [ new Entry('1', 'one'), new Entry('2', 'two'), new Entry('3', 'three'), new Entry('4', 'four'), ].forEach((e:Entry) => this.add(e)); } add(e:Entry):void { let id:string = e ? e._id : ''; let title:string = e ? e._title : ''; (<ControlArray>this.formModel.controls['entries']).push(this.fb.group({ id: this.fb.control(id, Validators.required), title: this.fb.control(title, Validators.required), })); this.data.entries.push(new Entry(id, title)); } get debug() { return JSON.stringify({debug_data: this.data}); } get debugForm() { return JSON.stringify({ debug_form: { dirty: this.formModel.dirty, pristine: this.formModel.pristine, touched: this.formModel.touched, untouched: this.formModel.untouched, valid: this.formModel.valid, } }); } get ctrlCount() { return (<ControlArray>this.formModel.controls['entries']).length; } } 进行Linq查询。我知道这与标准IReliableDictionary不一样,但如果有人有运气我很好奇。我开始认为不幸的是,这是不可能的。

5 个答案:

答案 0 :(得分:3)

目前,在可靠的字典上执行linq查询没有正常的方法。话虽这么说,你可以做一些事情。如前所述,CreateEnumerableAsync方法存在的原因是因为服务结构将可靠的字典页面设置为磁盘,但是如果您知道底层集合很小并且您可以获得性能损失,则以下类将起作用。

append

您还可以实现自己的自定义枚举器和扩展方法,以高效的方式对数据执行linq-query操作。我已经写了一些我想要发布的内容但是他们需要先修饰一下。我有一种偷偷摸摸的感觉,服务面料团队可能已经在它上面,但是如果发生这种情况,你的猜测就像我的一样好。

答案 1 :(得分:1)

看起来MS在最新的SF版本中删除了执行linq查询的功能。

答案 2 :(得分:0)

如果您需要处理比简单GetByKey()更复杂的操作,您需要通过IReliableDictionary.CreateEnumerable()方法显式创建它的本地集合,然后您可以查询类似的来自the comments in this discussion的以下示例:

IAsyncEnumerable<KeyValuePair<int, string="">> enumerable = await myDictionary.CreateEnumerableAsync(tx);
using (IAsyncEnumerator<KeyValuePair<int, string="">> e = enumerable.GetAsyncEnumerator())
{
    while (await e.MoveNextAsync(cancellationToken).ConfigureAwait(false))
    {
         doSomething(e.Current);
    }
}

这可能根本不适合您的场景,但似乎它可能是执行任何类型的“高级查询”的唯一方法。

答案 3 :(得分:0)

右LINQ不适用于IAsyncEnumerator

var wgEnumerable = await voteDictionary.CreateEnumerableAsync(tx);
using(IAsyncEnumerator<KeyValuePair<string, int>> enumerator = wgEnumerable.GetAsyncEnumerator())
{
while(await enumerator.MoveNextAsync(CancellationToken.None))
{
//Do something
}
}

答案 4 :(得分:0)

在将SerivceFabric的 @Autowired private MapValidationErrorService mapValidationErrorService; @PostMapping("/employee/{deptId}") public ResponseEntity<?> addEmployee(@PathVariable(name = "deptId") String deptId,@Valid @RequestBody EmployeeDto employeeDto, BindingResult result) throws ClassNotFoundException { ResponseEntity<?> errorMap = mapValidationErrorService.MapValidationService(result); if(errorMap != null)return errorMap; return ResponseEntity.ok(employeeService.saveEmployee(deptId,employeeDto)); } 转换为dotnet 1之后,可以使用Async Linq。

请参考以下答案: Convert IReliableDictionary to IList