从您的示例中的主要问题是 “什么是outerIt”(@ 1.Contains(outerIt.Id) )这看起来只是一个更大的查询,你可能想要pos整套表达式。在一个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叉)
我创建可用此实现这里叉子: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这个小直接查询? – Krishna
“Id”和“Name”是根据实体而变化的属性。这只是一个例子,但是这个属性是参数化的。如果我使用动态的方式,它工作正常,但是当我尝试设置预定义的类,如“OneToManyViewModel”的情况下,发生此错误。 –