2015-01-13 29 views
1

我遇到了這個反覆出現的問題,我正在使用舊數據庫和linq到使用固定長度的char數據類型的sql。修剪字符串如果在Linq中不爲空

當我返回字符串它總是有填充的結束,如果我想在SELECT語句Concat的兩個字符串我總是需要這樣做之前要檢查如果不爲null如:

return (from person in personRepository.Get(p => p.FIRSTNAME.StartsWith(firstName) 
     || p.SURNAME.StartsWith(surname) || p.DOB == dob) 
       select new PersonSearchModel 
       { 
        FullUserName = (person.SURNAME ?? "").Trim() + ", " 
           + (person.FIRSTNAME ?? "").Trim() + " " 
           + (person.MIDDLENAME ?? "").Trim() 
       }).ToList(); 

有更好的方法?我可以在數據庫上下文中自動修剪字符串嗎?

+0

更好的計算策略是使用VARCHAR而不是char數據類型...並設置爲默認值「」數據庫中的表... –

+0

不幸的是我沒有這樣的選擇:) – Andrew

+0

你可以寫一個SQL Server自定義函數,但在代碼中保存很少的代碼 – DrKoch

回答

1

我最終改變了t4模板,以便這些類生成自動修剪的字符串,如果它們不爲空,則返回null。

public string Property(EdmProperty edmProperty) 
{ 
    string type = _typeMapper.GetTypeName(edmProperty.TypeUsage); 
    string propertyName = _code.Escape(edmProperty); 

    if(type == "string"){ 

    return string.Format(
     CultureInfo.InvariantCulture, 
     "private {1} _{6}; {5} \t{0} {1} {2} {{ {5}\t\t{3}get{{return _{6} == null ? null : _{6}.Trim();}} {5}\t\t{4}set{{ _{6} = value;}} }}", 
     Accessibility.ForProperty(edmProperty), 
     type, 
     propertyName, 
     _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), 
     _code.SpaceAfter(Accessibility.ForSetter(edmProperty)), 
     Environment.NewLine, 
     propertyName.ToLower() 
     ); 

    }else{ 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "{0} {1} {2} {{ {3}get; {4}set; }}", 
     Accessibility.ForProperty(edmProperty), 
     _typeMapper.GetTypeName(edmProperty.TypeUsage), 
     _code.Escape(edmProperty), 
     _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), 
     _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); 
     } 
} 
+0

如果你能寫更多關於模板的東西,我會很高興。哪裏可以找到它,以及如何或要改變什麼? – t3chb0t