Я использую 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;
}