larry118 Ответов: 3

Объединение строки и десятичной дроби в запросе Linq


Я пишу приложение на VS2010, Framework 4.0, C# и silverlight 4.

У меня есть простой класс и запрос Linq.

Класс такой:

public class pmDues
    {
        [Key]
        public int DuesID { get; set; }
        [DataMember]
        public string dues_type { get; set; }
        public decimal dues_amount { get; set; }
    }


В моем DomainService у меня есть следующий IQueryable:

public IQueryable<pmdues> GetDues()
   {
      return from dues in ObjectContext.tblDuesRates
                  orderby dues.due_type
         select new pmDues()
            {
              DuesID = dues.id,
              dues_type = dues.due_type,
              dues_amount = dues.amount.Value
              };
        }

До сих пор так хорошо.......Но!

Что я действительно хочу, так это показать dues_type + dues_amount сцепленными. Dues_amount объявляется как десятичное число в таблице SQL Server. Чего я не знаю, так это где и как объединить dues_type с dues_amount. Я попробовал следующее, Но это не сработало. Должен ли я делать конкатенацию в классе? Если да, то как. Все еще немного новичок в C#.

public IQueryable<pmdues> GetDues()
   {
      return from dues in ObjectContext.tblDuesRates
                  orderby dues.due_type
         select new pmDues()
            {
              DuesID = dues.id,
              dues_type = dues.due_type + " - " + 
                          dues.amount.Value.ToString(),
              dues_amount = dues.amount.Value
              };
        }



Спасибо

Ларри Фридман

3 Ответов

Рейтинг:
21

TheyCallMeMrJames

Похоже, вы используете LINQ для сущностей? Итак, происходит то, что внутренние компоненты LINQ пытаются преобразовать строку.Отформатируйте обратно что-нибудь на SQL Server. Что...он не может.

У вас есть два варианта:
1) Заходим в класс путь только для чтения свойство и падение concat в выбор.
2) Сначала преобразуйте коллекцию в какую-то перечислимую.


Итак, вот № 1:

public class pmDues
{
    [Key]
    public int DuesID { get; set; }
    [DataMember]
    public string dues_type { get; set; }
    public decimal dues_amount { get; set; }
    public string DuesText
    {
        get
        {
            return string.Format("{0} - {1}", dues_type, dues_amount);
        }
    }
}


Поскольку вы сначала выбираете новые объекты,свойства должны быть заполнены, что позволяет конкату работать. Я не могу на 100% проверить это прямо сейчас, но я почти уверен, что это сработает.

Номер 2 кажется мне немного более хакерским. Вам нужно будет сделать что-то вроде следующего [пост].


Овации,
-Джеймс


Рейтинг:
2

larry118

Спасибо, я только что добавил {1:F2}, и все!

Я ценю вашу помощь.

Ларри


Рейтинг:
18

TheyCallMeMrJames

Если все, что вы делаете, - это хотите принудить эту строку к отображению (и не заботитесь о сохранении текста в dues_text для других целей, попробуйте это сделать:

public IQueryable GetDues()
{
    return from dues in ObjectContext.tblDuesRates 
           orderby dues.due_type
           let dueText = string.Format("{0} - {1}", dues.due_type, dues.amount.Value)
           select new pmDues
              {
                DuesID = dues.id,
                dues_type = dueText,
                dues_amount = dues.amount.Value 
              };
}


Все, что мы делаем, - это соединяемся со струной.Формат. Пусть позволяет встроенный ценности должны быть построены. Это также помогает ему быть немного более читабельным.

Кроме того, как это не работает? Вы получаете ошибку? Это может быть та самая сумма взносов.Значение равно null, что вызовет исключение.

Кроме того, если вы хотите создать что-то всегда доступное и хотите сохранить значение dues_type, создайте свойство только для чтения в своем классе, которое выполняет ту же строку.Форматирование для возврата двух других свойств.

Овации,
-Джеймс


larry118

Спасибо, что ответили, но, к сожалению, это не сработало. DomainService понравился код, но когда я пытаюсь запустить приложение, я получаю следующее сообщение:

Система.Услуга.Модель.DomainService.Клиент.Не удалось выполнить операцию загрузки DomainOperationException для запроса 'GetDues'.Linq to Entities не распознает систему методов.Строка.Формат (System.Строка.Система.объектная система.объектная система.Object)' метод, и этот метод не может быть преобразован в выражение хранилища

Может быть, я пропустил ссылку?

Ларри