如何在[HttpGet] ActionResult for Edit中将任何id传递给linq连接

时间:2012-05-22 07:43:57

标签: asp.net-mvc-3 linq

我正在MVC3上创建一个Web应用程序,我正在使用linq与数据库进行通信。

我制作了一个复选框列表,用户可以根据自己的选择选择一些选项,并将其保存在数据库表中。问题出在编辑部分。

整个场景是这样的:

用户可以注册为餐馆老板或汽车旅馆老板,我已将不同的Business_Type_Id指定为1和2以区分这两者,我已为餐厅业务类型指定了'2',并将菜肴映射到特定业务通过在表格中添加“BusinessType”列,键入相同的“菜单”表。将为用户分配Business_Id用于其业务。我提供了一个复选框列表,它从数据库表“菜系”中生成其选项,我在其中列出了菜单。从前端,用户可以根据他们在餐厅提供的食物选择多种美食。选择可能因餐馆老板与另一餐馆老板而异,因此我将每个餐馆老板的选定值存储在“BusinessCuisinesMapping”表中,其中我将特定用户的特定BusinessId映射到所选择的CuisineId。 现在要填充菜单列表进行编辑或更新我写了一个linq连接,但我需要将它与传递给[HttpGet] ActionResult Edit的Business_Id进行比较。这就是我被卡住的地方。

这是我在控制器中使用的linq连接代码:

[HttpGet]
public ActionResult Edit(int id)
{
    using (var chkl = new BusinessEntities())
    {
        var data = (from CuisinesData in chkl.Cuisines
                join BusinessCuisineMappingData in chkl.BusinessCuisineMapping
                on new { CuisinesData.Id, id } equals new { BusinessCuisineMappingData.CuisinesId, BusinessCuisineMappingData.BusinessId }
                where CuisinesData.BusinessTypeId == 2
                select new CusinesDTO
                {
                    Id = CuisinesData.Id,
                        Name = CuisinesData.Name,
                        IsSelected = BusinessCuisineMappingData.CuisinesId == null ? false : true
                }).Distinct().ToList();
                ViewBag.CuisineList = data;
     }
     return View();
}

这是我的DTO课程:

public class CusinesDTO
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsSelected { get; set; }
    }

我想在我的LINQ连接中将“id”与“BusinessCuisineMappingData.BusinessId”字段进行comape,我通过[HttpGet] Actionresult Edit(int id)获取该字段。当我尝试实现它时,它会提示我一个错误。

2 个答案:

答案 0 :(得分:0)

  

“join子句中表达式的类型不正确。在”加入“调用中类型推断失败”

这表明JOIN两侧的类型不相等。您收到编译错误;应该相对容易地检查JOIN子句两侧的类型。

编辑:重新阅读你的内容,我认为你想做的事情如下:

[HttpGet]
public ActionResult Edit(int id)
{
    using (var chkl = new BusinessEntities())
    {
        var data = (from CuisinesData in chkl.Cuisines
                    join BusinessCuisineMappingData in chkl.BusinessCuisineMapping
                    on CuisinesData.Id equals BusinessCuisineMappingData.CuisinesId
                    where CuisinesData.BusinessTypeId == id
                    select new CusinesDTO
                    {
                        Id = CuisinesData.Id,
                        Name = CuisinesData.Name,
                        IsSelected = BusinessCuisineMappingData.CuisinesId == null ? false : true
                    }).Distinct().ToList();
                    ViewBag.CuisineList = data;
    }
    return View();
}

答案 1 :(得分:0)

您不能在联接中使用局部变量。但是,您可以在Where子句中使用它。所以,如果你这样做

join ...
on CuisinesData.Id equals BusinessCuisineMappingData.CuisinesId
...
where BusinessCuisineMappingData.BusinessId == id

你会有同样的效果。