LINQ: объединить несколько свойств int в строку - PullRequest
2 голосов
/ 24 февраля 2010

У меня есть объект с двумя разными целочисленными свойствами, и я пытаюсь получить новый объект в Linq to Entities, объединяющий два целочисленных свойства из того же объекта в виде сцепленных строк, как показано ниже

List<DateRange> collection = (from d in context.dates 
select new DateRange 
{ 
  DateString = from s in context.Seasons 
  where s.SeasonID = d.DateID 
  select string.Format("{0} - {1}", s.StartYear, s.EndYear) }

).ToList<DateRange>(); 

Конкатенация строк по годам не будет компилироваться.

Ответы [ 4 ]

3 голосов
/ 24 февраля 2010

Это будет работать в LINQ to Objects, при условии, что каждый объект в объектах является классом или структурой, содержащей поля или свойства «Number1» и «Number2»:

var results = from o in objects
              select string.Format("{0} - {1}", o.Number1, o.Number2);

(Впрочем, ваш оригинал тоже должен работать ...)

2 голосов
/ 24 февраля 2010

Если вы подключаетесь к базе данных через LINQ to SQL / Entities, то вызов String.Format, скорее всего, завершится неудачно, так как для этих поставщиков предложение select выполняется внутри базы данных. Не все можно перевести с C # на SQL.

Чтобы преобразовать результаты вашей базы данных в строку, как вы хотите, должно работать следующее:

var temp = (
  from d in context.dates 
  from s in context.Seasons 
  where s.SeasonID == d.DateID 
  select new { s.StartYear, s.EndYear }
).ToList(); // Execute query against database now, before converting date parts to a string

var temp2 = 
  from t in temp 
  select new DateRange 
  { 
    DateString = t.StartYear + " - " + t.EndYear 
  };

List<DateRange> collection = temp2.ToList();

EDIT: У меня была дополнительная мысль. Вызов String.Format, скорее всего, является проблемой. Я не уверен, сработает ли это или нет, но как насчет concat с обычной Джейн:

List<DateRange> collection = 
(from d in context.dates 
 select new DateRange 
 { 
   DateString = from s in context.Seasons 
   where s.SeasonID = d.DateID 
   select s.StartYear + " - " + s.EndYear
 }
).ToList<DateRange>(); 
2 голосов
/ 24 февраля 2010

Ваш оригинальный код работает, если вы действительно хотите то, что написали. Однако, если вы действительно хотите получить от

var objects = new MyObject[]{ 
    new MyObject {Int1 = 1, Int2 = 2},
    new MyObject {Int1 = 3, Int2 = 4}};

что-то вроде 1 - 2 - 3 - 4 вы можете написать

var strings = objects.Select(o = > string.Format("{0} - {1}", o.Int1, o.Int2).ToArray();
var output = string.Join(" - ", strings);
1 голос
/ 22 февраля 2012
using System.Data.Objects.SqlClient;
    :
    :
    List<DateRange> collection = (from d in context.dates 
    select new DateRange 
    { 
      DateString = from s in context.Seasons 
      where s.SeasonID = d.DateID 
      select SqlFunctions.StringConvert((double)s.StartYear) + " - " + 
             SqlFunctions.StringConvert((double)s.EndYear)
    }).ToList<DateRange>(); 

Метод StringConvert преобразуется в правильную функцию преобразования, когда оператор LINQ преобразуется в SQL для выполнения на сервере.

...