Linq-to-SQL - не работает - PullRequest
       3

Linq-to-SQL - не работает

2 голосов
/ 12 октября 2011

У меня есть этот код C # код в службе WCF:

using (DataClasses1DataContext db = new DataClasses1DataContext())
        {
            var members = from member in db.Stops_edited_smalls.Take(25)
                          where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05
                          && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05
                          select  member;
            return members.ToList();
        }

Наличие:

  .Take(25)

, как указано выше, не возвращает никаких повторенийПочему так?(работает без .Take (25))

Ответы [ 2 ]

7 голосов
/ 12 октября 2011

Потому что вы берете первые 25 до фильтрации в предложении where, а не после.Ни одна из этих 25 записей не соответствует предложению where.

Если вы хотите получить только первые 25 результатов, вы должны переместить вызов в Take ():

var members = (from member in db.Stops_edited_smalls
              where Math.Abs(Convert.ToDouble(member.Latitude)
                  - curLatitutde) < 0.05
              && Math.Abs(Convert.ToDouble(member.Longitude)
                  - curLongitude) < 0.05
              select member).Take(25);
5 голосов
/ 12 октября 2011

Как говорит Джастин, вы получили Take не в том месте. Это все равно что сказать «Найти первые 25 слов в словаре, а затем отфильтровать все, что не начинается с B.» Это не то, как вы находите первые 25 слов, начинающихся с B. Возможно, вы просто хотите:

using (DataClasses1DataContext db = new DataClasses1DataContext())
{
    var members = 
      from member in db.Stops_edited_smalls
      where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05
         && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05
      select member;

    return members.Take(25).ToList();
}

Я предпочитаю помещать Take вызов отдельно в выражение запроса, просто для удобства чтения. Однако любой из них будет работать, и этот действительно выполняет «только первые 25 значений» в базе данных, а не локально.

Учитывая, что вам нужны только «первые» 25 строк, вам, вероятно, следует указать порядок, например,

    var members = 
      from member in db.Stops_edited_smalls
      where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05
         && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05
      orderby member.Latitude
      select member;

... кроме использования того свойства, которое вы действительно хотите заказать.

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