如何在 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),
再次感谢
在 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),
再次感谢