2011-03-04 76 views
0

我有一个IQueryable我从包含名为“NewValue”字段的数据库中选择。该字段将包含0,1或2.我想用基于它的数字的字符串替换值。
即0 =“有效”。我知道IQueryables不是用来改变值大多只是用于查询,但我需要使用它在下一行添加到视图模型基于结果使用LINQ替换IQueryable中的所有值使用LINQ

var AssessmentList = assessment      
.Select(p => new LogManagementViewModel 
{ 
    newValue = p.NewValue, 
}); 

我如何更改assement.NewValue所有值的字符串?

回答

1
var values = new [] {"StrValue1", "StrValue2", "StrValue"}; 

var AssessmentList = assessment      
    .AsEnumerable() 
    .Select(p => new LogManagementViewModel 
     { 
      newValue = values[p.NewValue], 
     }); 
+0

我以前尝试这样做,它给了我一个错误消息说,一个LINQ的IQueryable不能包含数组索引。我是释义我忘了实际的错误代码 – Loogawa 2011-03-04 20:53:43

+0

@Loogawa - 这就是你应该从什么开始。在这种情况下,添加'AsEnumerable()'调用:var AssessmentList = assessment.AsEnumerable()。选择(...);'或者使用其他方法使它与SQL一起工作 – Snowbear 2011-03-04 20:55:39

+0

这很好。虽然在这里有很多很好的答案,但我也可以做到。我第一次尝试这样做的唯一缺点是.AsEnumerable()。我仍然不明白这是如何工作的。 – Loogawa 2011-03-04 21:03:03

0

方式一:

添加一个新的计算性能到您的类(假设你有任何生成的代码之外的部分类)。然后,那个计算出的类可以做翻译,但它需要。您的视图模型可以引用此计算值。

0

我会让你LogManagementViewModel一个构造函数重载,做这项工作对你来说,是这样的:

public LogManagementViewModel(int NewValue) 
{ 
    switch(NewValue) 
    { 
     case 0: 
     this.NewValue = "Active"; 
     break; 
     // etc... 
    } 
} 

IMO,这个地方在它的适当位置的逻辑,让您的视图模型翻译它应该是,它不是你的LINQ /数据库查询的责任。

+0

问题是我有其他的事情,使用viewModel它不会是一个数字,但我想我可以测试这与额外的逻辑。不过这是个好主意。谢谢 – Loogawa 2011-03-04 20:55:01

+0

你总是可以有多个构造函数,构造一个适合你的需求的构造函数。 – CodingGorilla 2011-03-04 20:57:34

+0

我真的很喜欢这个答案,但@snowbear非常接近我已经完成的工作。只需要添加.AsEnumerable(),所以我会给他。但我喜欢这个答案 – Loogawa 2011-03-04 21:01:58

2
var dictionary = new Dictionary<int, string> 
{ 
    { 0, "Active" }, 
    { 1, "Inactive" }, 
    // etc 
}; 

var AssessmentList = assessment      
.Select(p => new LogManagementViewModel 
{ 
    newValue = dictionary[p.NewValue], 
}); 

这也适用于其他类型之间的映射。

1

最简单,最干净的将是一个映射方法:

string MapToString(int value) 
{ 
    //.. 
} 

var AssessmentList = assessment      
.Select(p => new LogManagementViewModel 
{ 
    NewValue = MapToString(p.NewValue), 
});