Преобразование анонимного типа в IList - PullRequest
2 голосов
/ 15 декабря 2011

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

public IList<Store> getNearbyStores(double x, double y)
{
    var result = (from T in
                      (
                        (from stores in dc.Stores
                           select new
                           {
                               stores.id,
                               stores.name,
                               stores.city,
                               stores.typeID,
                               stores.latitude,
                               stores.longitude,
                               stores.tag1,
                               stores.tag2,
                               Distance = (System.Double?)(6371 * Math.Acos((double)Math.Cos((double)(Math.PI * x) / 180) * Math.Cos((double)(Math.PI * stores.latitude) / 180) * Math.Cos((double)(Math.PI * stores.longitude) / 180 - (Math.PI * y) / 180) + Math.Sin((double)(Math.PI * x) / 180) * Math.Sin((double)(Math.PI * stores.latitude) / 180)))
                           }))
                  where
                    T.Distance < 5
                  orderby
                    T.Distance
                  select new
                  {
                      T.id,
                      T.name,
                      T.city,
                      T.typeID,
                      T.latitude,
                      T.longitude,
                      T.tag1,
                      T.tag2,
                      T.Distance
                  }).ToList();

    return result;
}

Ошибка:

Error   1   Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Collections.Generic.IList<Store>'. An explicit conversion exists (are you missing a cast?) C:\Users\Joris\Desktop\ShopperNET\App_Code\DAL\DALstore.cs  104 16  C:\...\ShopperNET\

Как преобразовать анонимный тип возвратак IList?Я полагал, что toList () это исправит, но это не так ... Я пробовал кое-что, что я нашел в Интернете, например, использование просто List, но ничего из этого мне не помогло.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 15 декабря 2011

Использование

    select new Store()
    {
      Id = stores.id,
      Name = stores.name,
      ... 
    }
...

вместо select new { } для выбора экземпляров типа Store, а не анонимного типа

(Вы можете заменить оба случая, но важен второй, так как это будет возвращено)

См. MSDN , MSDN для инициализации типа

2 голосов
/ 15 декабря 2011

Ваша сигнатура метода ожидает возврата List<Store>, вы можете попробовать вернуть ее из запроса LINQ, например,

//top bit of query
//.
select new Store()
{
    Id = T.id,
    Name = T.name,
    //etc..
}).ToList();

РЕДАКТИРОВАТЬ: Следуя предложению Pranay ниже, должно работать следующее:

var result = from store in dc.Stores
             let Distance = (System.Double?)(6371 * Math.Acos((double)Math.Cos((double)(Math.PI * x) / 180) * Math.Cos((double)(Math.PI * store.latitude) / 180) * Math.Cos((double)(Math.PI * store.longitude) / 180 - (Math.PI * y) / 180) + Math.Sin((double)(Math.PI * x) / 180) * Math.Sin((double)(Math.PI * store.latitude) / 180)))
             where Distance < 5
             order by Distance
             select store;

return result.ToList();
1 голос
/ 15 декабря 2011

Я думаю, вы должны сделать пользователя клавишной Into или Let, чем вы можете перейти к шагу 2.

Проверьте сообщение для более подробной информации: Into и впустите LINQ (Let vsInto)

Пример

from student in students
                let x = student.Scores[0] + student.Scores[1] +
                    student.Scores[2] + student.Scores[3]
                where x > averageScore
                select new { id = student.ID, score = x };
...