我试图根据我的模型返回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:ProjectsBenchmarksBenchmarksBenchmarks_Home.aspx.cs 63 25 Benchmarks
由于您以 select new {...}
结束查询,因此您将为每个结果创建一个匿名对象。相反,请使用 select p
,每个结果都将是一个Benchmark
。
但是,看起来返回Benchmark
不是您想要的。在这种情况下,您可能希望将查询更改为 IQueryable
或 IQueryable<dynamic>
类型(并且可能还会更改 GetBenchMarks
函数的返回类型,除非它确实返回 IQueryable<Benchmark>
!
第二种(可能更好)的替代方法是创建一个类来表示此匿名类型,并使用它。
查询的结果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 ....}