2012-02-09 33 views
0

我不确定它是否是最好的公式化问题,但我想实现的是我有99%的数据库对象。在这个例子中,我使用AnonymousList从SQL获取几列,然后将其转换为Entity对象。如何强制显示int?值在Enity框架对象中的字符串?

我已经扩展了具有属性Size的对象,以便能够在数据库中分配对象的大小。

public partial class SzkolenieMaterialyPrzedmiotowe { 
    public int? Size { get; 
     set; 
    } 
} 

下面的代码来得到的东西去

using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) 
     { 

      var anonimowaLista = context.SzkolenieMaterialyPrzedmiotowes.Where(d => d.SzkolenieID == szkolenieId).Select(d => new 
      { 
       d.MaterialyPrzedmiotoweID, 
       d.MaterialyPrzedmiotoweTyp, 
       Size = SqlFunctions.DataLength(d.MaterialyPrzedmiotowePlik), 
       d.MaterialyPrzedmiotoweOpis 
      }).AsEnumerable(); // anonymous list created to get only few columns 

      var listaSzkolenieMaterialyPrzedmiotowe = anonimowaLista 
      .Select(d => new SzkolenieMaterialyPrzedmiotowe 
      { 
       MaterialyPrzedmiotoweID = d.MaterialyPrzedmiotoweID, 
       MaterialyPrzedmiotoweTyp = d.MaterialyPrzedmiotoweTyp, 
       MaterialyPrzedmiotoweOpis = d.MaterialyPrzedmiotoweOpis, 
       Size= d.Wielkosc, 
      }).ToList(); // list based on anonymous list 

      objectListViewMaterialySzkoleniowe.SetObjects(listaSzkolenieMaterialyPrzedmiotowe); 
     } 

我怎么能力的大小转换为KB(Helpers.ConvertBytesToKilobytes(Size ?? 0);)后,实际显示本身,使其成为后,这样我就可以加入KB的字符串在ObjectListView中显示它而不是int值?

我试图做这样的,但似乎失败..

public partial class SzkolenieMaterialyPrzedmiotowe { 
    public int? Size{ get; 
     set; 
    } 
    public string SizeToString 
    { 
     get 
     { 
      return Helpers.ConvertBytesToKilobytes(Size ?? 0); 
     } 
     set { 
     } 
    } 
} 
+2

'公共覆盖的ToString()'? – 2012-02-09 14:18:08

回答

1

您可以在大小属性只是转换为字符串,并计算你的LINQ表达式里面的“XKB”。但是大多数人不想丢失数字字节值。如果是这样,只需创建另一个属性或(静态)方法,将字节大小转换为字符串后跟单位。

如Valdislav建议的那样做一个ToString()重写可以工作,但是如果仅为一个大小转换(imo)覆盖整个对象的整个ToString()功能将会有点混乱。你可以考虑参数化ToString来增加更多的清晰度,如果没有参数传递,只需调用base。

下面是一个简单的例子的要求(和编辑基于评论):

class Program 
{ 
    static void Main(string[] args) 
    { 
     var myDemo = new Demo(); 
     myDemo.Size = 1000000; 
     myDemo.Value = 15.7m; 

     Console.WriteLine("ToSizeInKb: " + myDemo.ToString(DemoConversionType.ToSizeInKb)); 
     Console.WriteLine("ToValue: " + myDemo.ToString(DemoConversionType.ToValue)); 
     Console.WriteLine(Environment.NewLine + "Press enter to exit."); 
     Console.ReadKey(); 
    } 

    /// <summary> 
    /// Defines different ways to convert the Demo class objects into strings. 
    /// </summary> 
    enum DemoConversionType 
    { 
     ToSizeInKb, 
     ToValue 
    } 

    class Demo 
    { 
     public int? Size { get; set; } 
     public decimal Value { get; set; } 

     /// <summary> 
     /// Override the default ToString method and pass a "DemoConversionType" 
     /// that defaults how the object should be converted to a string. 
     /// </summary> 
     /// <returns></returns> 
     /// <param name='convType'></param> 
     public string ToString(DemoConversionType convType) 
     { 
      switch (convType) 
      { 
       // Return the Size in Kb 
       case DemoConversionType.ToSizeInKb: 
        return Size.GetValueOrDefault()/1000 + "Kb"; 
       // Return the Value to 2 decimal places. 
       case DemoConversionType.ToValue: 
        return string.Format("{0:N2}", Value); 
       // Bad conv type, default back to the base ToString() method. 
       default: 
        return base.ToString(); 
      } 
     } 
    } 
} 
+0

检查我的编辑。我添加了我在发布之前尝试过的代码,但它不起作用+我真的不知道如何在anonymouse类型和转换类型中使用它。换句话说,你在说什么以及如何使用它的例子会很好:-) – MadBoy 2012-02-09 15:40:58

+0

@MadBoy添加了一些演示代码,演示了所提到的解决方案之一。 – Timeout 2012-02-10 01:20:23

+0

它如何知道ToString()与Size有关?如果我有Size,ID和其他一些字段以及一个ToString()会怎么样?如果我想要有多个选择,比如ToString的大小是一回事,那么如果ToString的ID是somethign else等,我该如何实现呢? – MadBoy 2012-02-16 20:13:20