Select 使用 System.Linq.Dynamic 的子句返回“'(' expected”错误

Select Clause using System.Linq.Dynamic is returning "'(' expected" fault

我正在尝试使用 linq dynamic 创建一个选择 returns 我是一个特定的对象。但我总是收到相同的错误消息:'(' expected

我的select代码:

var resultCollection = manyPartEntireCollection
                .Select("new MyNamespace.OneToManyViewModel(@0 as OnePartId, Id as ManyPartId, Name as Name, @1.Contains(outerIt.Id) as Enable)", onePartId, manyParIds)
                .Cast<OneToManyViewModel>()
                .ToList()
                ;

谢谢!

你的例子中的主要问题是 "what is outerIt?" (@1.Contains(outerIt.Id)) 这看起来只是一部分更大的查询。您可能想要 post 完整的表达式集。

基于对您所追求的外观的假设:在单个 Linq 语句中可能是可能的,但在涉及视图模型和本机时,我经常遇到围绕 Linq2Entities/Linq2SQL 的怪异主义。 Netmethods/structures所以我倾向于默认选择数据单独到最后格式化

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 叉子,因为它看起来是最新的)

我创建了一个分支,这里提供了这个实现:https://github.com/StevePy/System.Linq.Dynamic我将向 meatGUY 提交一个拉取请求,看看它是否值得合并。

我进行了修改,它似乎达到了您的预期。不知道为什么这还没有被正式纳入,因为它很有道理。 :)

他的说明很容易遵循,您最终会得到一个如下所示的电话:

var resultCollection = manyPartEntireCollection
  .Select<OneToManyViewModel>("new (@0 as OnePartId, Id as ManyPartId, Name as Name, @1.Contains(outerIt.Id) as Enable)", onePartId, manyParIds)
  .ToList();

我用一个类似的对象模型对它进行了测试,其中包含在视图模型中设置布尔标志,效果很好。需要注意的是 "outerIt" 引用的内容。