#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
действует очень похоже на .NETDataReader
; то есть вам нужно читать из него до конца, чтобы получить данные — он действует как курсор только для переадресации, доступный только для чтения. Семантика запроса 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