如何将linq结果列表发送到ajax c#?

时间:2015-06-16 15:53:05

标签: c# ajax linq

我想要做的是,在项目对象中返回项目列表,然后将其发送给json,但我不知道我做错了什么:

  public ActionResult editarComanda(int idcomanda)
        {

            List<Items> objectes = new List<Items>();
            var db = new daw_tenda();

              var llistaobjectes =  db.Llistes.Where(x => x.comandes_id == idcomanda).ToList();

                foreach (var item in llistaobjectes)
                {
                   **objectes.Add(db.Items.Where(x => x.Id == item.items_id).ToList());**   

                }
                return Json(objectes, JsonRequestBehavior.AllowGet);

        }

如何添加来反对该linq查询的结果?

这是我的Ajax脚本:

  $(".editar").click(function () {  //BUTO editar comanda
                                var itemid = $(this).attr('id');
                                $("#contingutllistes").empty();
                                $.ajax({
                                    url: "/Perfil/editarComanda",
                                    dataType: 'json',
                                    type: 'POST',
                                    data: {
                                        idcomanda: itemid,
                                    },
                                    success: function (response) {
                                        console.log(response);
                                        if (response) {
                                            for (var i = 0; i < response.length; i++) {
                                             ???

                                            }
                                            $("#contingutllistes").show();
                                        }

                                    }
                                });

                            });

1 个答案:

答案 0 :(得分:0)

尝试使用AddRange上的方法objectes,如下所示:

foreach (var item in llistaobjectes)
{
    objectes.AddRange(db.Items.Where(x => x.Id == item.items_id).ToList());
}

您也可以使用objectes.Add(db.Items.Where(x => x.Id == item.items_id).FirstOrDefault()),但我不确定您的数据库结构是什么,因此可能无效。

序列化实体框架对象

您无法直接序列化实体框架对象,因为导航属性将导致循环引用。您有两种选择:

  1. 使用Select(x => new { ... })创建一个您将返回的匿名对象,而不是返回Item个对象。

  2. 创建一个除了保存您要为Item发送的值之外什么都不做的类。这被称为DTO模式,IMO是更好的选择。

  3. 选项1可以帮助您,但选项2将更易于维护。

    以下是选项1的示例,以便您可以开始使用:

    foreach (var item in llistaobjectes)
    {
        objectes.AddRange(db.Items.Where(x => x.Id == item.items_id).Select(x => new
            {
                Id = x.Id,
                SKU = x.SKU, //No idea what your table looks like
                AnotherProperty = x.AnotherProperty, //again, no idea...
            }).ToList());
    }
    

    <强>性能

    但我现在要告诉你,表现不会好。你应该做的是用以下的方法替换你的方法:

    public ActionResult editarComanda(int idcomanda)
    {
        var db = new daw_tenda();
    
    
    
        var llistaIds =  db.Llistes.Where(x => x.comandes_id == idcomanda)
            .Select(x => x.items_id)
            .ToList();
    
        var objectes = db.Items.Where(x => llistaIds.Contains(x.Id)).ToList();
        return Json(objectes, JsonRequestBehavior.AllowGet);
    }
    

    这恰好执行两个数据库查询。您之前的那个将为每个id执行数据库查询。这个新的首先加载id然后加载你的项目。第二个查询实际上创建了一个WHERE IN SQL查询(在ContainsWhere将在大多数情况下创建 <!-- ============ HEADER SECTION ============== --> <td colspan="2" style="height: 100px;" bgcolor="#777d6a"> <h1>Add a New Subdiv file <a href="/main" class="HomeButton"> <img src="../../../../Pictures/dwelling1.png" height="50"/></a> <a href="/logout" class="LogoutButton"> Logout </a></h1></td></tr> 时,包含列表是字符串或整数或其他内容的列表)对于中等大小的名单,这应该表现得相当好。

    <强>除了

    这不是我的答案的一部分,但您是否尝试过Web API查看MVC4 / 5?我曾经使用MVC来做JSON,但它使用时间戳之类的东西并且总体上难以使用。 Web API可能更适合您尝试的操作。