Как я могу сделать простую проверку "=" и сравнение строк в предикате LINQ? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть этот метод, который я использовал для вывода данных из CosmosDB:

async static Task ListData<T>(Expression<Func<T, Boolean>> predicate) where T : LogBase
{
   var abc = await cosmosManager.GetDocumentItemsAsync<T>(predicate);
   foreach (var a in abc)
      Console.WriteLine(a.DateYYMMDD);
}

Когда я называю это здесь, он работает хорошо:

await ListData<LogFeedback>(x => x.Activity == "Feedback" &&
                            x.FeedbackType == 0 && 
                            x.Name == "N3");

Однако это не работает ( Счетчик равен 0, но должен быть> 0)

await ListData<LogFeedback>(x => x.Activity == "Feedback" &&
                            Int32.Parse(x.DateYYMMDD) < Int32.Parse("200321"));

Далее я попробовал это, и это не работает:

await ListData<LogFeedback>(x => x.Activity == "Feedback" &&
                            String.Compare(x.DateYYMMDD, "200320") < 0);

Я думаю, это может быть связано с тем, как он переводит параметр, как при проверке с помощью отладки, выглядит следующим образом:

enter image description here

Есть ли другой способ сделать простую проверку для <моя дата, которая представлена как YYMMDD или я что-то не так делаю. Я просто не вижу причины, по которой тест даты не работает. </p>

Вот код для GetDocumentItemsAsync:

public async Task<List<T>> GetDocumentItemsAsync<T>(Expression<Func<T, Boolean>> predicate) where T : class
{
    List<T> Items = new List<T>();
    try
    {
        collectionLink = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
        var i = 1;
        var query = client.CreateDocumentQuery<T>(collectionLink)
            .Where(predicate)
            .AsDocumentQuery();
        while (query.HasMoreResults)
        {
            Console.WriteLine(i++);
            var retrivedData1 = await query.ExecuteNextAsync<T>();
            Items.AddRange(retrivedData1);
        }
    }
    catch (DocumentClientException ex)
    {
        Debug.WriteLine("Error: ", ex.Message);
    }
    return Items;
}

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Поскольку «даты» хранятся в виде строки с легко сопоставимым форматом, нет необходимости приводить к числу перед сравнением, просто сравните строки:

await ListData<LogFeedback>(x => x.Activity == "Feedback" &&
                            x.DateYYMMDD) < "200321");

Конечно, реальное решение проблема состоит в том, чтобы использовать надлежащие типы данных в базе данных, хранить даты как даты вместо строк, что дает другие преимущества помимо этой конкретной проблемы.

0 голосов
/ 01 апреля 2020

Решение Luciano Borges должно работать, потому что я попытался следующим образом. Так что могут быть и другие проблемы.

        var t1 = DateTime.ParseExact("200401", "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
        var t2 = DateTime.Parse("2020-03-20");
        Debug.WriteLine("t1=" + t1); //t1=2020/4/1 上午 12:00:00
        Debug.WriteLine("t2=" + t2); //t2=2020/3/20 上午 12:00:00
        Debug.WriteLine("t1<t2 ==" + (t1<t2)); //t1<t2 ==False
0 голосов
/ 01 апреля 2020

Полагаю, вам следует проанализировать Datetime, а не Integer. Примерно так:

await ListData<LogFeedback>(x => x.Activity == "Feedback" &&
                            DateTime.ParseExact(x.DateYYMMDD, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture) < Datetime.Parse("2020-03-20"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...