如何在C#lambda选择列表查询中添加条件语句来赋值?
我有一个工作的lambda查询,它获取附近地图点的列表数据。如何在C#lambda选择列表查询中添加条件语句来赋值?,c#,json,asp.net-mvc,linq-to-entities,google-maps-markers,C#,Json,Asp.net Mvc,Linq To Entities,Google Maps Markers,我有一个工作的lambda查询,它获取附近地图点的列表数据。FoodType值表示餐厅属于哪一组,如下所示:3-意大利人,1-墨西哥人,4-印度人 如何向查询添加条件if语句,该语句将根据其FoodType值为该映射点指定不同颜色的图标 我想要 1-墨西哥将成为Icon=“../Images/red dot.png” 3-意大利语将成为Icon=“../Images/yellow dot.png” 5-亚洲将成为Icon=“../Images/bluedot.png” 这是我的控制器代码: [H
FoodType
值表示餐厅属于哪一组,如下所示:3-意大利人
,1-墨西哥人
,4-印度人
如何向查询添加条件if
语句,该语句将根据其FoodType
值为该映射点指定不同颜色的图标
我想要
1-墨西哥
将成为Icon=“../Images/red dot.png”
3-意大利语
将成为Icon=“../Images/yellow dot.png”
5-亚洲
将成为Icon=“../Images/bluedot.png”
这是我的控制器代码:
[HttpPost]
public ActionResult Index(float latitude, float longitude)
{
var sourcePoint = CreatePoint(latitude, longitude);
var locations = db.Restaurants
.Where(loc => loc.GeoLocation.Distance(sourcePoint) < 1500)
.OrderBy(loc => loc.GeoLocation.Distance(sourcePoint))
.Select(loc => new MapViewModel
{
Address = loc.PrimaryAddress1,
City = loc.PrimaryCity,
HHName = loc.HHName,
Age = loc.Age,
FoodType = loc.FoodType,
Id = loc.Id,
Latitude = (float)loc.Latitude,
Longitude = (float)loc.Longitude,
Distance = loc.GeoLocation.Distance(sourcePoint),
})
.ToList();
return Json(locations, JsonRequestBehavior.AllowGet);
}
[HttpPost]
公共操作结果索引(浮动纬度、浮动经度)
{
var sourcePoint=CreatePoint(纬度、经度);
var位置=分贝餐厅
.其中(loc=>loc.地理位置距离(震源点)<1500)
.OrderBy(loc=>loc.GeoLocation.Distance(sourcePoint))
.选择(loc=>new MapViewModel
{
地址=loc.PrimaryAddress1,
城市=位置PrimaryCity,
HHName=loc.HHName,
年龄=位置年龄,
FoodType=loc.FoodType,
Id=位置Id,
纬度=(浮动)位置纬度,
经度=(浮动)位置经度,
距离=位置地理位置距离(震源点),
})
.ToList();
返回Json(位置,JsonRequestBehavior.AllowGet);
}
这是我的地图代码:
(我甚至尝试在脚本中设置贴图点颜色,但没有成功)
$.ajax({
类型:“POST”,
url:“索引/”,
数据:{“纬度”:纬度,“经度”:经度,“地址”:地址},
数据类型:“json”,
位置:latLng,
中心:拉特林,
成功:函数(数据){
$.each(数据、函数(索引、值){
var latlng=new google.maps.latlng(value.lation,value.Longitude);
var marker=new google.maps.marker({
位置:latlng,
图标:“../Images/blue dot.png”,
标题:value.HHname,
地址:value.address,
城市:价值,城市,
食物:value.FoodType,
年龄:价值。年龄,
id:value.id,
地图:地图
});
var contentString=''+
'' +
'' +
“”+value.HHName+“”+
'' +
“”+value.FoodType+””+
“Age:”+value.Age+“”+
“”+value.Address+,“+value.City+””+
“”+
“”+
'' +
'';
var infowindow=new google.maps.infowindow({
最大宽度:250,
内容:contentString
});
marker.addListener('click',function()){
信息窗口。打开(地图、标记);
});
});
},
错误:函数(XMLHttpRequest、textStatus、errorshown){
警报(“状态:+textStatus”);警报(“错误:+ERRORSHORN”);
},
});
为了可读性和可重用性,编写一个单独的函数,将FoodType
值转换为相应的图标
string GetIconForFoodType(string foodType)
{
//Your function
}
然后在创建MapViewModel
时,分配
Icon = GetIconForFoodType(loc.FoodType)
如果您使用的是LINQ to Entities或Entity Framework,则不能在查询中使用自定义方法,因为底层提供程序希望能够将查询表达式直接转换为SQL。如果您得到一个错误,说该方法无法识别,这就是原因。您只能使用基础提供程序知道如何翻译的方法。考虑到这一点,您可以采取几种不同的方法 1。使用三元运算符计算值 这有点难看,但它应该可以工作,因为它可以转换为SQL
CASE
表达式
var locations = db.Restaurants
.Where(...)
.OrderBy(...)
.Select(loc => new MapViewModel
{
...
FoodType = loc.FoodType,
Icon = "../Images/" +
(loc.FoodType == "1 - Mexican" ? "red" :
(loc.FoodType == "3 - Italian" ? "yellow" : "blue")) +
"-dot.png",
...
})
.ToList();
2。运行查询,然后修复结果,然后将其返回给客户端
当您需要运行服务器端方法以在结果中包含计算数据,而LINQ to实体不支持该方法时,这是通常的解决方法
// DB query
var locations = db.Restaurants
.Where(...)
.OrderBy(...)
.Select(loc => new MapViewModel
{
...
FoodType = loc.FoodType,
...
})
.ToList();
// Fix up
foreach (var model in locations)
{
model.Icon = GetIconForFoodType(model.FoodType);
}
return Json(locations, JsonRequestBehavior.AllowGet);
3。更改数据模型以在表中包含图标图像名称
如果图标名称是表数据的一部分,则不需要翻译;您可以直接将其包含在结果中
var locations = db.Restaurants
.Where(...)
.OrderBy(...)
.Select(loc => new MapViewModel
{
...
FoodType = loc.FoodType,
Icon = "../Images/" + loc.IconName
...
})
.ToList();
布赖恩的回答#1真的帮助了我。为了防止对这里的任何人有所帮助,我的实现在下面完美地工作。正如他所建议的那样
@Html.DropDownList("TaxonId", Model.Taxa.Select(i => new SelectListItem()
{
Text = i.TaxonName,
Value = i.Id.ToString(),
Selected = (i.Id == @Model.Site.TaxonId) ? true : false
}),
"Select taxon",
new { @class = "form-control edited", required = String.Empty })
尝试使用您的建议后,我收到一条错误消息,LINQ to Entities无法识别该方法。是否LINQ需要将整个查询表达式转换为服务器查询,因此我不能在其中调用外部方法?我该怎么做?回答得很好,我真的帮了我的忙。请参阅下面我的答案,以了解运行良好的实现。布赖恩的答案是正确的,但我为子孙后代补充我的答案。
@Html.DropDownList("TaxonId", Model.Taxa.Select(i => new SelectListItem()
{
Text = i.TaxonName,
Value = i.Id.ToString(),
Selected = (i.Id == @Model.Site.TaxonId) ? true : false
}),
"Select taxon",
new { @class = "form-control edited", required = String.Empty })