Как исправить сортировку дат на сервереC#

Место общения программистов C#
Ответить
Anonymous
 Как исправить сортировку дат на сервере

Сообщение Anonymous »

Я пишу API для своего проекта и одна из его функций — сортировка данных, полученных из базы данных. Используя все локально на своем ноутбуке и Swagger, все работает как надо, но когда я запускаю тот же код на сервере, у меня начинаются проблемы с датой. Сортировка прерывается и возвращает пустые списки
Пытался исправить разными методами, например форматированием полученных данных, но проблему это не решило
Мой код:
public class Sort
{
private readonly IMongoDatabase _database;
public double sumExpense { get; private set; } = 0.0;

public Sort()
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();

string? mongodbKey = configuration["Tokens:MongoDbConnection"];
MongoClient client = new(mongodbKey);
_database = client.GetDatabase("finances");
}

public async Task RunAsync(AuthData request, double ID)
{
var collection = _database.GetCollection("Expense");
string format = "yyyy-MM-dd";

if (!DateTime.TryParseExact(request.FirstDate, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime firstDateTime) ||
!DateTime.TryParseExact(request.LastDate, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime lastDateTime))
{
return new BsonDocument
{
{ "Error", "Invalid date format" }
};
}

var startOfFirstDay = new DateTime(firstDateTime.Year, firstDateTime.Month, firstDateTime.Day, 0, 0, 0, DateTimeKind.Unspecified);
var endOfLastDay = new DateTime(lastDateTime.Year, lastDateTime.Month, lastDateTime.Day, 23, 59, 59, DateTimeKind.Unspecified);

var idFilter = Builders.Filter.Eq("User", ID);
var dateFilter = Builders.Filter.Gte("Date", startOfFirstDay) &
Builders.Filter.Lte("Date", endOfLastDay);

var combinedFilter = idFilter & dateFilter;
var sortedByCategoryTask = AsyncSortingByCategory(collection, combinedFilter);
var sortedByTagsTask = AsyncSortingByTegs(collection, combinedFilter);

await Task.WhenAll(sortedByCategoryTask, sortedByTagsTask);

var bsonDocument = new BsonDocument
{
{ "Category", sortedByCategoryTask.Result },
{ "Tegs", sortedByTagsTask.Result }
};

return bsonDocument;
}

private async Task AsyncSortingByCategory(
IMongoCollection collection,
FilterDefinition filter)
{
var sortedData = new BsonDocument();

var sortDefinition = Builders.Sort.Ascending("Category");
var documents = await collection
.Find(filter)
.Sort(sortDefinition)
.ToListAsync();

foreach (var document in documents)
{
string categoryName = document["Category"].AsString;
double sum = document["Sum"] switch
{
BsonDouble bsonDouble => bsonDouble.Value,
BsonInt64 bsonInt64 => bsonInt64.Value,
BsonDecimal128 bsonDecimal => (double)bsonDecimal.Value,
_ => Convert.ToDouble(document["Sum"])
};

if (!sortedData.Contains(categoryName))
{
sortedData[categoryName] = new BsonArray();
}

sumExpense += sum;
var array = sortedData[categoryName].AsBsonArray;
array.Add(document);
}

return sortedData;
}

private async Task AsyncSortingByTegs(
IMongoCollection collection,
FilterDefinition filter)
{
var options = new JsonSerializerOptions
{
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};

var sortedData = new BsonDocument();
var documents = await collection.Find(filter).ToListAsync();

foreach (var document in documents)
{
if (document["Tegs"].IsBsonArray)
{
BsonArray tegs = document["Tegs"].AsBsonArray;

foreach (string teg in tegs)
{
if (!sortedData.Contains(teg))
{
sortedData[teg] = new BsonArray();
}

var array = sortedData[teg].AsBsonArray;
array.Add(document);
}
}
}

return sortedData;
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... the-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»