将匿名类型转换为IList

时间:2011-12-15 06:59:27

标签: c# asp.net .net casting ilist

我从以下代码中得到了一个我并不理解的错误:

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 个答案:

答案 0 :(得分:2)

使用

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

而不是select new { }来选择Store类型的实例,而不是匿名类型的实例

(你可以替换两个出现,但重要的是第二个出现,因为这是将要返回的内容)

请参阅MSDNMSDN了解类型初始值设定项

答案 1 :(得分:2)

您的方法签名期望返回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();

答案 2 :(得分:1)

我认为您应该使用IntoLet关键字,而不是第2步。

查看帖子了解详情:Into and let in LINQ ( Let vs Into)

示例

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 };