我有一个自引用表:拥有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;
}
此查询两次命中数据库,是否有更好的方法可以一次对数据库命中一次?任何帮助将不胜感激。
答案 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();