我正在尝试使用C#中的IQueryable上的LINQ查询结果填充listview控件。这应该是世界上最简单的操作,但我是asp.net,c#和visual studio的新手。我有这个:
var query = from i in _db.ItemListView
where (!string.IsNullOrEmpty(key)) ? i.Description.Contains(key) : true &&
DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog))*0.0006214 <= rng &&
(cat != null) ? i.CategoryID == cat : true &&
(sub != null) ? i.SubCategoryID == sub : true &&
(min != null) ? i.AskingPrice >= min : true &&
(max != null) ? i.AskingPrice <= max : true
orderby i.Distance ascending, i.AskingPrice ascending
select i;
return query;
这样可行,但数据库返回的i.Distance
字段在设计上为null。我想使用以下值填充i.Distance
字段:
DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog))
geog
是基于邮政编码的经度和纬度的变量。
有人请告诉我该怎么做吗?
答案 0 :(得分:2)
您需要计算距离,然后选择包含它的新对象。类似的东西:
var query = from i in _db.ItemListView
let dist = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog))
where (!string.IsNullOrEmpty(key)) ? i.Description.Contains(key) : true &&
dist*0.0006214 <= rng &&
(cat != null) ? i.CategoryID == cat : true &&
(sub != null) ? i.SubCategoryID == sub : true &&
(min != null) ? i.AskingPrice >= min : true &&
(max != null) ? i.AskingPrice <= max : true
orderby dist ascending, i.AskingPrice ascending
select new WhateverYourClassNameIs(constructor parameters here);
return query;
或者,您可以使用
select new Whatever { field1=value, field2=value, etc. };
答案 1 :(得分:0)
听起来像是需要自定义select
:
...
select new {
// other fields here,
...
MyNewDistanceField = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog))
}
或者,将输出字段映射到自定义类:
select YourCustomClass {
// other fields here,
...
MyNewDistanceField = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog))
}
YourCustomClass
将包含您需要的字段定义。