Linq2Db и string.join () - PullRequest
       13

Linq2Db и string.join ()

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

Я использую Linq2db в своем большом запросе с подзапросами.В одном месте внутри я хочу использовать string.Join ():

...
FullPath = string.Join(" -> ", GetPathQuery(db, c.Id).Select(pi => pi.Name))
...

Но я получил исключение:

LinqException: 'Join ("->", значение (RI.DAL.Categories.AdminCategoryPreviewDAL) .GetPathQuery (значение (RI.DAL.Categories.AdminCategoryPreviewDAL + <> c__DisplayClass4_0) .db, c.Id) .Select (pi => pi.Name)) 'нельзя преобразоватьв SQL.

Я использую Postgre SQL, и он имеет функцию concat_ws, которая идеально подходит для меня.Поэтому я пытаюсь использовать его:

[Sql.Expression("concat_ws({1}, {0})")]
public static string JoinAsString(this IQueryable<string> query, string separator)
{
    return string.Join(separator, query);
}

...
FullPath = GetPathQuery(db, c.Id).Select(pi => pi.Name).JoinAsString(" -> ")
...

Но мне не удалось с тем же исключением.


Полный исходный код GetPathQuery:

    private IQueryable<CategoryPathItemCte> GetPathQuery(IStoreDb db, Guid categoryId)
    {
        var categoryPathCte = db.GetCte<CategoryPathItemCte>(categoryHierarchy =>
        {
            return
                (
                    from c in db.Categories
                    where c.Id == categoryId
                    select new CategoryPathItemCte
                    {
                        CategoryId = c.Id,
                        ParentCategoryId = c.ParentId,
                        Name = c.Name,
                        SeoUrlName = c.SeoUrlName
                    }
                )
                .Concat
                (
                    from c in db.Categories
                    from eh in categoryHierarchy.InnerJoin(ch => ch.ParentCategoryId == c.Id)
                    select new CategoryPathItemCte
                    {
                        CategoryId = c.Id,
                        ParentCategoryId = c.ParentId,
                        Name = c.Name,
                        SeoUrlName = c.SeoUrlName
                    }
                );
        });

        return categoryPathCte;
    }

1 Ответ

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

Можете ли вы попробовать вот так,

FullPath = string.Join(" -> ", GetPathQuery(db, c.Id).Select(pi => pi.Name).ToList());

Более удобный для запросов подход

GetPathQuery(db, c.Id).Select(pi => pi.Name)
   .Aggregate(string.Empty, (results, nextString) 
               => string.Format("{0} -> {1}", results, nextString));
...