Как заставить отображение int?значение в виде строки в объекте Enity Framework? - PullRequest
0 голосов
/ 09 февраля 2012

Я не уверен, что это лучший сформулированный вопрос, но я хотел добиться того, чтобы у меня было 99% объекта из базы данных. В этом примере я использую AnonymousList, чтобы просто получить несколько столбцов из SQL, а затем преобразовать его в объект Entity.

Я расширил объект со свойством 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);
        }

Как я могу заставить Size на самом деле отображать себя после преобразования в КБ (Helpers.ConvertBytesToKilobytes(Size ?? 0);), чтобы он стал строкой с добавлением КБ после него, чтобы я мог показать его в ObjectListView вместо значения int?

Я пытался сделать это так, но, похоже, это не удалось ..

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

1 Ответ

1 голос
/ 09 февраля 2012

Вы можете просто преобразовать свойство размера в строку и вычислить «XKb» внутри выражения linq. Однако большинство людей не хотят терять числовое значение байта. Если это так, просто создайте другое свойство или (статический) метод, который будет преобразовывать размер байта в строку, за которой следуют единицы.

Выполнение переопределения ToString (), как предположил Валдислав, сработало бы, но было бы немного странно переопределить всю функциональность ToString () для всего объекта только для преобразования размера (imo). Вы можете рассмотреть параметризацию ToString, чтобы добавить больше ясности и просто вызвать базу, если параметры не переданы.

Вот простой пример в соответствии с запросом (и отредактированный на основе комментариев):

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();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...