2016-06-01 3 views
0

Что лучше всего подходит для написания concat в Linq? Я знаю, что официальное слово состоит в том, что вы не можете, но я слышал, что есть способы его достижения, и мне нужна помощь в этом. У меня есть заявление SQL, который выглядит следующим образом:Как написать SQL Concat в Linq?

CONCAT(
    [event_organiser] , 
    ' ', DATEPART(dd,[event_start]), 
    '/', DATEPART(mm, [event_start])) 
    AS organiser_info 

Мне нужно, чтобы создать это в Linq, но я не знаю, как на основе моей текущей настройки. Вот мой текущий выбор.

var datacontext = db.tbl_events.AsQueryable(); 

IQueryable<EventsViewModel> theevent = (

      from v in datacontext 
      where v.event_start == null 
      select new EventsViewModel 
      { 
       event_idx = v.event_idx, 
       event_name = v.event_name 
       ...concat goes here.. 
      }); 
+0

работал для моего конкретного сценария

next_charterer_info = string.Concat(p.fixture_charterer ?? "", " ", p.fixture_start.Value.Day, "/", p.fixture_start.Value.Month), 

Спасибо Что такое db.tbl_events там? Нет данных, но что? Если вам действительно не нужен IQueryable, проще всего использовать AsEnumerable() и продолжить с простой C# concat (вероятно, string.Format). –

ответ

1

Благодарим вас за отзыв по этому вопросу, ваши комментарии и примеры привели меня к ответу, основанному на том, что вы показали мне. Вот что снова

1
var theevent = (

     from v in datacontext 
     where v.event_start == null 
     select new EventsViewModel 
     { 
      event_idx = v.event_idx, 
      event_name = v.event_name 
      organiser_info = string.Format("{0} {1}/{2}", event_organiser ?? "", event_start.Date.ToString("d"), event_start.Date.ToString("M")) 
     }); 

ОБНОВЛЕНИЕ

String.Concat (строка, строка, строка) значительно быстрее, чем String.Format(). Кроме того, вы можете написать, что, как это:

organiser_info = string.Concat(event_organiser ?? ""," ", event_start.Date.ToString("d"), event_start.Date.ToString("M")) 

UPDATE2

Раствор для retrive IQueryable odject:

IQueryable<EventsViewModel> theevent = (

      from v in datacontext 
      where v.event_start == null 
      select new EventsViewModel 
      { 
       event_idx = v.event_idx, 
       event_name = v.event_name, 
       organiser_info = v.event_organiser ?? "" + 
       v.event_organiser ? " " : "" + 
       v.event_end ? SqlFunctions.DatePart("Day", v.event_end) : "" + 
       v.event_end ? SqlFunctions.DatePart("Month", v.event_end) : "" 
      } 

Не забудьте добавить using System.Data.Objects.SqlClient для SqlFunctions.DatePart.

MSDN От

Эта функция переводится в соответствующую функцию в базе данных . Для получения информации о соответствующей функции SQL Server, см. DATEPART (Transact-SQL).

+0

Это не очень хорошо переводится на SQL. Я предполагаю, что вопрос будет выполняться в отношении базы данных, и поэтому вы ограничены конструкциями, которые поддерживает поставщик Linq для SQL. Я не думаю, что string.format относится к этой категории :-). Просто используйте «+», чтобы присоединиться к строкам? –

+0

Я действительно не считаю, что все утверждения 'select new EventsViewModel ...'будет переведен в sql –

+0

@LayonezWronskey, как только запрос будет реализован с использованием .ToList(), например, это не сработает: LINQ to Entities не распознает метод« System.String ToString (System.String) ». Также на этом: указанный тип member 'Date' не поддерживается в LINQ to Entities. –

2

Просто используйте «+», чтобы присоединиться к строкам?

from v in datacontext 
where v.event_start == null 
select new EventsViewModel 
    { 
     event_idx = v.event_idx, 
     event_name = v.event_name 
     organiser_info = event_organiser + ' ' + ... 
    }); 
1

Вы можете использовать SqlFunctions (https://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.datepart(v=vs.110).aspx)

IQueryable<EventsViewModel> theevent = (

     from v in datacontext 
     where v.event_start == null 
     select new EventsViewModel 
     { 
      event_idx = v.event_idx, 
      event_name = v.event_name 
      organiser_info = v.event_organiser + ' ' + DatePart("dd", v.event_start) 
     }); 

Другой вариант включает в себя все необходимые столбцы и расширить EventsViewModel со свойством геттерного:

public class EventsViewModel 
{ 
    ... 
    public string organiser_info 
    { 
     get 
     { 
      return string.format("{0} {1}/{2}", 
       event_organiser, 
       event_start.ToString("dd"), 
       event_end.ToString("MM")) 
     } 
    } 
} 

Используя этот подход, вы сможете не сталкиваться с любыми непереводимыми кодовыми конструкциями в Linq для объектов

+0

+1. Второй метод (с использованием рассчитанного свойства) также будет означать меньшее количество данных, передаваемых из БД, что должно быть хорошо. –

+0

(предполагая, то есть, вы все равно будете отбрасывать эти другие столбцы) –

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