【问题标题】:LINQ dynamic expression with string join带有字符串连接的 LINQ 动态表达式
【发布时间】:2019-01-29 23:06:59
【问题描述】:

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

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()。 我读过关于聚合的文章,但我所有的尝试都没有结果。所以问题是如何用 linq 表达式获得一个合并的字符串?

【问题讨论】:

  • String.Join(Environment.NewLine, s.Message) 的意义何在?我很好奇,除了s.Message,它什么时候返回?

标签: c# sql linq expression


【解决方案1】:
string.Join(
    "\n",
    db.MsgHistory
    .Where(s => s.FK_MsgHistory_MsgID.Id == id)
    .Where(s => !string.IsNullOrEmpty(s.Message))
    .Select(s => s.Message))

应该做的伎俩

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

【讨论】:

    【解决方案2】:

    您正在返回IQueryable&lt;string&gt; 类型的集合。您需要返回一个字符串。

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

    【讨论】:

    • Piotr 的回答是正确的,但没有解释为什么他会得到["Text One","Text Two", "Text Three"] 以及正确的方法签名是什么
    • 我得到的是 IQueryable - 好像 OP 已经知道他得到了一个 IQueryable如何获得一个合并的字符串 - 他似乎也知道他想要一个 string ;) 不过,澄清问题本身并不是一个坏习惯 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多