带有字符串连接的LINQ动态表达式

时间:2019-01-29 14:33:40

标签: c# sql linq expression

我有当前项目中的这段代码

public Expression<Func<MyObject, object>> CreateSelectExp(a, b)
{
    return x => new
    {
        x.Id,
        x.Status,
        x.DateCreated,
        x.Theme,
        Message = MergeMessage(db, x.Id)
    };
}

private IQueryable<string> MergeMessage(ConnectTo db, Guid id)
{
     return db.MsgHistory
         .Where(s => s.FK_MsgHistory_MsgID.Id == id)
         .Where(s => !string.IsNullOrEmpty(s.Message))
         .Select(s => String.Join(Environment.NewLine, s.Message));
}

我得到的是IQueryable,最后(在客户端)看起来像这个["Text One","Text Two", "Text Three"],但是我需要的是一个像这样的字符串Text One, Text Two, Text Three。由于我在CreateSelectExp()中有一个SQL表达式字符串,因此无法在其中获得任何List()或Array()。 我读过有关Aggregate的文章,但是我的所有尝试都没有结果。因此,问题是如何使用linq表达式获取单个合并的字符串?

2 个答案:

答案 0 :(得分:0)

string.Join(
    "\n",
    db.MsgHistory
    .Where(s => s.FK_MsgHistory_MsgID.Id == id)
    .Where(s => !string.IsNullOrEmpty(s.Message))
    .Select(s => s.Message))

应该做到这一点

编辑: 如果您希望所有内容都在一行中,则可以使用不同的分隔符,例如“,”。

答案 1 :(得分:0)

您将返回IQueryable<string>类型的集合。您需要返回一个字符串。

private string MergeMessage(ConnectTo db, Guid id)
{
    return string.Join(", ",
        db.MsgHistory
        .Where(s => s.FK_MsgHistory_MsgID.Id == id)
        .Where(s => !string.IsNullOrEmpty(s.Message))
        .Select(s => s.Message))
}