Предложение LINQ, проверьте, остались ли элементы

#c# #linq

#c# #linq

Вопрос:

Мы новички в LINQ, и мы хотим знать, есть ли какой-либо способ проверить, остались ли элементы в предложении, например, ResultSet.next() из Java.

В Java результирующий набор возвращает true, если остались элементы, и false, если нет. Мы хотим знать, есть ли такой метод в LINQ.

 public List<Product> FindProductsByKeyword(string productName, Category category, int page, int size)
    {

        DbSet<Product> products = Context.Set<Product>();

        List<Product> resu<
        if (category == null)
        {
            result = (from p in products
                      where p.productName.Contains(productName) //, StringComparison.OrdinalIgnoreCase)
                      orderby p.productName descending
                      select p).Skip(page).Take(size).Include("Category").ToList();
        }
        else
        {
            result = (from p in products
                      where p.productName.Contains(productName)
                      amp;amp; p.categoryId == category.id
                      orderby p.productName descending
                      select p).Skip(page).Take(size).ToList();
        }


        return resu<
    }
 

В этом нашем коде (я не знаю, поможет ли это) мы берем элементы с определенным размером, но мы не знаем, есть ли еще элементы.

Комментарии:

1. «в предложении»? Каков результирующий набор в вашем примере кода C #? result в size нем не более элементов, и вы можете увидеть, что многие из них находятся result , посмотрев на result.Count . У вас больше нет доступа к элементам, кроме тех, что в базе данных после того, как вы выполнили Take .

2. Я предполагаю, что Java ResultSet действует очень похоже на .NET DataReader ; то есть вам нужно читать из него до конца, чтобы получить данные — он действует как курсор только для переадресации, доступный только для чтения. Семантика запроса LINQ ближе к операциям set, распространенным в реляционной базе данных. Доставляемые данные в конечном итоге доставляются в виде IEnumerable, но семантически все они есть, как только запрос материализуется (например, путем вызова ToList() )

Ответ №1:

Использование метода завершения ToList() инициирует запрос к БД и анализирует возвращенную таблицу как простую в памяти List<T> (так же, как ArrayList<T> в Java).

Если вы хотите проверить, есть ли какие-либо записи в результате, вы можете просто проверить свойство списка Count :

 if (result.Count > 0)
{
    // Do something
}
 

Или используйте Any() метод расширения LINQ, который немного более удобочитаем в этом контексте:

 if (result.Any())
{
    // Do something
}
 

Ответ №2:

Если вы вернули перечислимое значение, то вы могли бы использовать Enumerable.MoveNext()

Например:

 var p = products.AsEnumerable();

var i = p.GetEnumerator();

while( i.MoveNext())
    i.Current.productfieldname.Dump() // LinqPad .Dump() shows value