如何在 Linq 中编写 SQL Concat?

How do I write a SQL Concat in Linq?

在 Linq 中编写 concat 的最佳方法是什么?我知道官方的说法是你做不到,但我听说有很多方法可以做到,我需要帮助才能做到这一点。我有一个 SQL 语句,内容如下:

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

我需要在 Linq 中创建它,但我不确定如何基于我当前的设置。这是我当前的 select 声明。

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..
             });
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, string, string) 明显快于 String.Format()。你也可以这样写:

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

更新2

检索IQueryable对象的解决方案:

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) : ""
             }

不要忘记为 SqlFunctions.DatePart 添加 using System.Data.Objects.SqlClient

来自MSDN

This function is translated to a corresponding function in the database. For information about the corresponding SQL Server function, see DATEPART (Transact-SQL).

只用“+”连接字符串?

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 + ' ' + ...
    });

您可以使用 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)
         });

其他选项是包括所有需要的列并使用 getter 属性:

扩展您的 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 to Entities 中遇到任何不可翻译的代码结构

感谢您对这个问题的反馈,您的意见和示例使我根据您向我展示的内容得出了答案。这是适用于我的特定场景的方法

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

再次感谢