在MVC5控制器中将两个Linq查询合并为一个更好的方法

时间:2018-07-27 22:09:20

标签: asp.net-mvc linq

在使用EntityFramework的MVC应用程序中,

我有一个自引用表:拥有customerParentID的客户。对于没有电子邮件的孩子,我希望能够将信件发送给父母电子邮件。这是我可以使用的解决方案,但是我要访问数据库3次,并且我想将最后2个合并为一个。

控制器Linq查询

useParentEmail是一个布尔值,适用于没有电子邮件的孩子 Id是通过参数获取的

var b = db.Lists.SingleOrDefault(a => a.LatestTxnId == Id);
 var customerWithNoEmail = db.Customers.SingleOrDefault(a => a.CustomerID == b.CustomerID && a.useParentEmail);
    if (customerWithNoEmail != null)
      {
      var customerParent = db.Customers.SingleOrDefault(a => a.CustomerID == customerWithNoEmail.ParentCustomerID);
         customerParentEmail = customerParent.Email;
       }

此查询两次命中数据库,是否有更好的方法可以一次对数据库命中一次?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

假设您在模型中使用的Entity Framework具有正确的导航属性,从而可以自动进行连接,则类似的事情可能会起作用(为了示例方便,我将LinqPad和linq应用于对象)。老实说,尽管我曾经是Entity Framework的重度用户,但几年来我都没有使用它,所以我可能会有些生疏。

 var customers = new[]
 {
    new { CustomerID = 1, useParentEmail = true, email = "", ParentCustomerID = (int?)2 },
    new { CustomerID = 2, useParentEmail = false, email = "parent@example.org", ParentCustomerID = (int?)null },
    new { CustomerID = 3, useParentEmail = false, email = "child@example.org", ParentCustomerID = (int?)null }

 };


int id = 1;


var emails = (from c in customers
            join p in customers on c.ParentCustomerID equals p.CustomerID into childrenParents
            from cp in childrenParents.DefaultIfEmpty()
            where c.CustomerID == id
            select new
            {
                c.CustomerID,
                email = c.useParentEmail == true ? cp.email : c.email
            }).SingleOrDefault();


emails.Dump();