Динамическое выражение LINQ со строковым соединением - PullRequest
0 голосов
/ 29 января 2019

У меня есть этот код из моего текущего проекта

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.Поскольку у меня есть строка выражения SQL в CreateSelectExp(), я не могу получить там List () или Array ().Я читал об Агрегате, но все мои попытки не дали результата.Итак, вопрос в том, как получить одну объединенную строку с выражением linq?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы возвращаете коллекцию типа 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))
}
0 голосов
/ 29 января 2019
string.Join(
    "\n",
    db.MsgHistory
    .Where(s => s.FK_MsgHistory_MsgID.Id == id)
    .Where(s => !string.IsNullOrEmpty(s.Message))
    .Select(s => s.Message))

Нужно сделать трюк

РЕДАКТИРОВАТЬ: вы можете использовать другой разделитель, как ",", если вы хотите, чтобы все в одной строке.

...