Проблема: < /p>
У меня есть DB1 с таблицей пользователей. x от db2. < /p>
Я делаю запрос для поиска пользователей, и я хочу иметь возможность заказать результаты, используя свойства от DB2. чтобы сортировать их. Это займет некоторое время ... < /p>
Я придумал идею, которая могла бы улучшить производительность, но у меня возникли проблемы с ее реализацией. < /P>
Если бы я мог принести словарь отображения (AddressId, OrderIndex), основанный на команде OrderBy, я бы мог создать запрос пользователей, использующих адресаты, которые будут заказать их по локальности. это: < /p>
Код: Выделить всё
var addressesOrderMap = await DB2Context.Addresses
.Include(a => a.Locality)
.OrderBy(a => a.Locality.Name)
.Select((a, index) => new { a.Id, OrderIndex = index })
.ToDictionaryAsync(x => x.Id, x => x.OrderIndex);
< /code>
Результат: < /p>
{
17: 0,
21: 1,
10: 2,
...
}
< /code>
Это будет стоить меньше, чем фактически получить все адреса .. < /p>
Затем сделайте что -то вроде этого: < /p>
var pageAddresses = await DB1Context.Users
.Select(u => u.AddressId)
.Distinct()
.ToListAsync();
// Filter the map to only the needed IDs
var filteredOrderMap = addressOrderMap
.Where(kvp => pageAddresses.Contains(kvp.Key))
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
// Query users and order by the precomputed OrderIndex
var orderedUsers = await DB1Context.Users
.Where(c => filteredOrderMap.Keys.Contains(c.AddressId))
.OrderBy(c => filteredOrderMap[c.AddressId])
.Skip(pageIndex * pageSize)
.Take(pageSize)
.ToListAsync();
Любые идеи или решения?
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/797 ... y-from-db2