我试图返回一个基于我的模型的IQueryable。
但是我需要两次加入同一个查找表。然后将查询变量返回到网格视图。
public IQueryable<Benchmark> GetBenchMarks([QueryString("hydrant")] string hydrant,
[QueryString("revdate")] string revdate, [QueryString("street")] string street,
[QueryString("quadrant")] string quadrant, [QueryString("desc")] string desc) {
IQueryable<Benchmark> query = from p in _db.Benchmarks
join s in _db.Streets on p.Street1Number equals s.Id
join s2 in _db.Streets on p.Street2Number equals s2.Id
select new {
Street1Name = s.StreetName,
p.OrderNumber,
p.HydrantNumber,
Street2Name = s2.StreetName,
p.RevisionDate,
p.Quadrant,
p.Description,
p.Street1Number
};
}因此,在s2的第二个连接处有一条红色的切换线。以及下面的错误。
Error 5 Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.IQueryable<Benchmarks.Model.Benchmark>'. An explicit conversion exists (are you missing a cast?) C:\Projects\Benchmarks\Benchmarks\Benchmarks_Home.aspx.cs 63 25 Benchmarks
发布于 2013-01-22 21:32:56
由于您使用select new {...}结束查询,因此您将为每个结果创建一个匿名对象。相反,使用select p,每个结果都将是一个Benchmark。
但是,似乎返回一个Benchmark并不是您想要的。在这种情况下,您可能希望将查询更改为IQueryable或IQueryable<dynamic>类型(并且可能也更改GetBenchMarks函数的返回类型,除非它返回IQueryable<Benchmark>!)。
另一个(可能更好的)选择是创建一个类来表示这个匿名类型,并使用它。
发布于 2013-01-22 21:43:54
查询的结果是匿名对象的IEnumerable,因此不能转换为Benchmark。
如果您想从连接关系中设置一些附加属性(Street1Name -显然不是映射到DB上),您可以这样做:
IQueryable<Benchmark> query = from p in _db.Benchmarks
join s in _db.Streets on p.Street1Number equals s.Id
join s2 in _db.Streets on p.Street2Number equals s2.Id
select new {
....
};
var ex = query.ToList();
var result = new List<Benchmark>();
foreach(bn in ex){
result.Add(new Benchmark{ OrderNumber = bn.OrderNumber .... });
}
// return result.AsQueryable();
// but now it losts the point to return it as queryable, because the query was already executed so I would simply reurn that list
return result;另一个选项是创建表示查询中的对象的新类,并从方法中返回它,如下所示:
... select new LoadedBenchmark { Street1Name = s.StreetName ....}https://stackoverflow.com/questions/14468240
复制相似问题