public async Task <List <ChatVm> > FindChatsAsync(SearchChatVm template, int limit = 100, long navigationChatId = 0, long?nodeId = null) { using (MessengerDbContext context = contextFactory.Create()) { IQueryable <Chat> query; if (template != null) { ExpressionsHelper expressionsHelper = new ExpressionsHelper(); query = context.Chats .AsNoTracking() .OrderBy(chat => chat.Id) .Where(expressionsHelper.GetChatExpression(template)) .Take(limit); } else { query = context.Chats .AsNoTracking() .OrderBy(chat => chat.Id) .Take(limit); } if (nodeId != null) { query = query.Where(chat => chat.NodesId.Contains(nodeId.Value)); } List <Chat> result = await query .Where(chat => chat.Deleted == false && chat.Id > navigationChatId && (ChatType)chat.Type != ChatType.Private) .ToListAsync() .ConfigureAwait(false); return(ChatConverter.GetChatsVm(result)); } }
public Expression <Func <Chat, bool> > GetChatExpression(SearchChatVm templateChat) { ExpressionStarter <Chat> chatCondition = PredicateBuilder.New <Chat>(); if (!string.IsNullOrWhiteSpace(templateChat.Name)) { chatCondition = chatCondition.And(chat => chat.Name.ToLower() == templateChat.Name.ToLower()); } if (templateChat.Tag != null) { chatCondition = chatCondition.And(chat => chat.Tag == templateChat.Tag); } return((Expression <Func <Chat, bool> >)chatCondition.Expand()); }