如何在C#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

我有一个工作的lambda查询,它获取附近地图点的列表数据。
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 })