在View Model中调用函数?

时间:2012-02-04 02:39:58

标签: c# .net regex asp.net-mvc-3

我有一个视图模型

 public class PersonsViewmodel
    {
     public string FirstName { get; set; }// from DB
     public string LastName { get; set; }// from DB
     public string FullName { get; set; } // this should be a custom value
 }
  

linq查询

  var per = from p in db.Persons  where p.Active==0          
                     select new PersonsViewmodel
                     { FirstName =p.FirstName ,LastName =p.LastName ,
FullName =Reg(p.FirstName)
};

public static string Reg(string str)
                 {
                    return str = Regex.Replace(str, "[^a-zA-Z0-9]+", "-", RegexOptions.Compiled);
                 }

这会抛出错误

  

LINQ to Entities无法识别方法'System.String   reg(System.String)'方法,这个方法无法翻译成   商店表达。

有没有更好的方法在模型中调用此Reg函数而不是调用linq查询,或者我应该在linq查询之后调用函数?

现在我在视图中执行此操作

@{
var FullName = Regex.Replace(model.FirstName, "[^a-zA-Z0-9]+", "-");
}

并使用变量FullName进行渲染。

3 个答案:

答案 0 :(得分:1)

之后你必须这样做。在编写LINQ查询时,您必须记住,如果它无法转换为T-SQL,它可能无法正常工作。

答案 1 :(得分:1)

这不是视图模型的工作吗?

public class PersonsViewmodel
{
    public string FirstName { get; set; }// from DB
    public string LastName { get; set; }// from DB
    public string FullName 
    { 
        get 
        { 
            return Regex.Replace(FirstName, "[^a-zA-Z0-9]+", "-", RegexOptions.Compiled); 
        }
    }
}

答案 2 :(得分:0)

@Malcolm是对的,LINQ2SQL尝试将整个表达式转换为T-SQL,这并非总是可行。

之后你可以尝试这样做:

var pre = ...LINQ2SQL query...;
var pre2 = pre.ToList().Select(p =>{ p.FirstName, p.LastName, FullName =Reg(p.FirstName)});