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" 引用的内容。
我正在尝试使用 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" 引用的内容。