延迟加载mvc3

时间:2011-08-10 17:24:34

标签: linq asp.net-mvc-3

我有订单 - 客户表

我正在使用延迟加载来提取订单客户信息。

var ordercustomer = db.Orders.Include("customers").Where(c.orderid == id);

所以我已经撤销了相关客户的订单

我有来自表格值的CUSTOMERID,CUSTOMERCITY VALU

现在我的任务是检查客户和客户是否存在                 ordercustomer(linq的结果)

linq查询怎么样?

2 个答案:

答案 0 :(得分:0)

我认为你要求的是这样的东西:

db.Orders.Where(c => c.orderid == id)
    .Select(c => c.customers.Any(
        cu => cu.customerid == customerid && cu.customercity == customercity))
    .Single();

这将生成一个true或false值,告诉您给定订单是否具有与其关联的客户,该客户具有给定的ID和城市。如果订单不存在,将抛出异常。

在旁注中,当使用.Include时,称为急切加载。它与 lazy 加载相反。另请注意,您的原始查询实际上并未加载任何客户,因为您尚未通过调用.ToList或类似内容对其进行评估。在我提供的查询中,您不需要使用.Include,因为当数据库可以为您完成此工作时,没有理由将所有客户数据加载到内存中。

答案 1 :(得分:0)

您可能不需要LINQ查询,但@StriplingWarrior在他的答案中有它。

我无法确切地猜测您的表单值是如何存在的,因为您没有告诉我们,但我会假设它位于view model中,如下所述。如果不是,那可能应该是;)

public class OrderCustomerViewModel
{
    public int CustomerID { get; set; }
    public string CustomerCity { get; set; }
}

我还假设这个逻辑发生在控制器动作中。它可能不是最好的地方,但你可以把它放在那里。

public class CustomerController : Controller
{
    [HttpPost]
    public ActionResult CheckCustomer(OrderCustomerViewModel vm)
    {
        var ordercustomer = db.Orders.Include("Customers").Where(c.orderid == id);
        bool customerFound = false;
        foreach(var customer in ordercustomer.Customers)
        {
            if(customer.CustomerID == vm.CustomerID &&
               customer.CustomerCity == vm.CustomerCity)

                customerFound = true;
        }

        // now, do whatever you need to with customerFound
        ViewBag.CustomerFound = customerFound;
        return View();
    }
}

请注意,我已将您的OrdersCustomers个系列修改为大写。