我从以下代码中得到了一个我并不理解的错误:
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',但它们都没有真正帮助我。
提前致谢。
答案 0 :(得分:2)
使用
select new Store()
{
Id = stores.id,
Name = stores.name,
...
}
...
而不是select new { }
来选择Store
类型的实例,而不是匿名类型的实例
(你可以替换两个出现,但重要的是第二个出现,因为这是将要返回的内容)
答案 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)
我认为您应该使用Into
或Let
关键字,而不是第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 };