2015-07-08 2 views
0

Я пишу приложения в VS2010, Framework 4.0, C# и Silverlight 4.Объединить строку и десятичной в запросе Linq

У меня есть простой класс и 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 
       }; 
     } 

Благодаря

+0

Любое исключение? –

+0

Можете ли вы сообщить нам, что означает «Я пробовал следующее, но это не сработало»? Что случилось, что вы знаете, что это не сработало? – Enigmativity

+0

Не связывайте струны, это всегда плохая идея. Вместо этого используйте String.Format. Готов поспорить, что 'dues.amount' имеет значение null, поэтому' dues.amount.Value' выдает исключение NullReferenceException. Попробуйте 'String.Format (" {0} - {1} ", dues.due_type, dues.amount)' –

ответ

2

Использование SqlFunctions.StringConvert, который находится в System.Data.Entity.SqlServer в EF6 (System.Data.Objects.SqlClient в предыдущих версиях) для того, чтобы преобразовать decimal к string:

dues_type = dues.due_type + " - " + SqlFunctions.StringConvert(dues.amount), 
0

Попробуйте с удалением .ToString()

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, 
      dues_amount = dues.amount.Value 
      }; 
    } 
+1

@PanagiotisKanavos Что значит? 'String +" _ "+ decimal' не будет скомпилирован в C#? –

+0

@PanagiotisKanavos: Возможно, вы захотите попробовать. '' blah "+ 1M' в порядке. Это компилируется в вызов String.Concat, который может принимать объекты просто отлично. – Chris

+0

К сожалению. Тем не менее это все равно не поможет - вызов toString() 'будет по-прежнему выполняться самой картой. Удаление 'ToString()' ничего не изменит –

0

сделать предположение здесь, но дать это пойти и посмотреть, если он работает для вас.

public IQueryable<pmdues> GetDues() 
{ 
    return (from dues in ObjectContext.tblDuesRates 
      orderby dues.due_type).ToList(). 
      Select(x => new pmDues 
      { 
       DuesID = x.id, 
       dues_type = string.Format("{0} - {1}", 
          x.due_type, 
          x.amount), 
       dues_amount = x.amount.Value 
      }).AsQueryable(); 
} 
+0

Почему downvote без объяснений? – Ric

0

Что случилось с проблемой? Вы всегда можете использовать конкатенацию строк любым способом: String.Concat(a, b, c.ToString()) или просто a + b + c.ToString() и введите это значение в строку «dues_type». Что случилось с этим?

1

Класс SqlFunctions, который имеет методы использования, обработанные особым образом, при преобразовании дерева выражений в sql-запрос, и поэтому он вызывается на уровне db, но доступен только для Entity Framework> 4 (если я не ошибаюсь).

Но вы можете объединить свои ценности со стороной .NET. Просто используйте AsEnumerable для такого рода операций.

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

    return pmDues 
      .AsEnumerable() 
      .Select(d => 
       new pmDues() 
       { 
        DuesID = d.DuesID, 
        DuesType = d.dues_type + " - " + 
           d.dues_amount.ToString() 
       }); 
} 

Но вы не сможете вернуть IQueryable и, таким образом, выполнить фильтрацию или сортировку на уровне БД то.

Если код верхнего уровня, который вызывает GetDues, действительно должен выполнять такие операции, вы можете предоставить дополнительный параметр типа Func<IQueryable<pmdues>, IQueryable<pmdues>> в ваш метод и вызывать его перед AsEnumerable.

Смежные вопросы