Линк не показывает правильный номер - PullRequest
2 голосов
/ 28 ноября 2011

Я использую Linq следующим образом:

IQueryable<Rentals> rentals = from r in context.Rentals
                              select r;


foreach (Rentals r in rentals)
{
    str +=  r.ListingID + "|";             
}

, но str имеет только 50 записей, в то время как, если я делаю rentals.Count(), он показывает 1700. Я попытался отладить и увидел, что потокуправление выходит из цикла foreach после 50-й записи.Почему это так?

Ответы [ 4 ]

1 голос
/ 28 ноября 2011
List<Rentals> rentals = (from r in context.Rentals
                              select r).ToList();

Попробуйте сначала создать список и проверьте, работает ли он.Также используйте StringBuilder() для сборки.Дайте мне знать, если это работает.

0 голосов
/ 28 ноября 2011

Если вы используете IQueryable<T>, ваши результаты будут сначала подготовлены как оператор SQL (с использованием деревьев выражений), а затем выполнены и будут обработаны вне процесса (на стороне сервера), но если вы используете .ToList () на результат или используйте IEnumerable<T> тип возвращаемого значения - ваши результаты будут выполнены с использованием LINQ to Objects (в памяти), что и делает Count.

Попробуйте проверить свойство Expression переменной rentals при использовании IQueryable<T> в качестве возвращаемого значения. Я до сих пор не уверен, почему количество записей отличается, но ссылки ниже объясняют разницу и использование IQueryable<T> и IEnumerable<T>:

http://blogs.msdn.com/b/erickt/archive/2006/10/23/iqueryable-t-vs-ienumerable-t.aspx

http://jonkruger.com/blog/2007/10/19/iqueryable-vs-ienumerable-in-linq-to-sql-queries/

Возвращается IEnumerable против IQueryable

0 голосов
/ 28 ноября 2011

Можете ли вы изменить свой код следующим образом?

IEnumerable<Rentals> rentals = from r in context.Rentals
                               select r;
0 голосов
/ 28 ноября 2011

Попробуйте это:

List<Rentals> rentals = context.Rentals.ToList();

str = Enumerable.Aggregate(rentals, str, (current, r) => current + (r.ListingID + "|"));

Это более эффективно, чем цикл foreach.

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