2011-08-10 242 views
1

我有订单 - 客户表延迟加载mvc3

我使用lazyloading拉取订单客户信息。

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

,所以我已经拉到以便与相关客户

我有CUSTOMERID,从表单CUSTOMERCITY值的值

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

linq查询将如何看起来像?

+1

您可能会做得更好,以提供更多的代码示例。例如,id在哪里来自where子句,模型中的某个地方,控制器?此外,使用降价StackOverflow提供。例如,代码由4个缩进空格完成。我将编辑您的帖子以显示示例。 –

回答

0

我想你问的是这样的:

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

这将产生一个真或假的值,它会告诉你给定的顺序是否有与它关联的客户具有给定ID和城市。如果订单不存在,则会抛出异常。

附注中,使用时使用.Include,即渴望加载。这与懒惰加载相反。此外,请注意,您的原始查询实际上并没有加载任何客户,因为您尚未通过调用.ToList或类似方法对其进行评估。在我提供的查询中,您不需要使用.Include,因为当数据库可以为您完成这项工作时,没有理由将所有客户数据加载到内存中。

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集合资本化。