这是跨多个表比较数据的低效方法吗?

时间:2012-02-29 16:59:26

标签: asp.net sql asp.net-mvc entity-framework

我使用以下代码首先检查字符串是否位于数据库中某列的某个位置。如果是,我需要通过查看数据库的不同部分来检查是否满足一些额外的标准(可以在下面的代码中看到)。我不确定这是否是一种有效的方法,或者有一种更简单的方法:

(来自我的控制器)

    [HttpPost]
    public ActionResult Index(FormCollection sampleKey)
    {
        string code = sampleKey["sampleCode"];
        ViewBag.code = code;
        // Need to check if this code is active
        var order = db.Orders.SingleOrDefault(
            o => o.OrderCode == code
                && o.Active == true);
        if (order == null)
        {
            //Invalid
        }
        else
        {
            var orderIdent = db.OrderDetails.SingleOrDefault(
                p => p.OrderDetailId == order.OrderId);
            var barIdent = db.Drink.SingleOrDefault(
                q => q.EstablishmentsID == orderIdent.DrinksId);
            var barName = db.Establishment.SingleOrDefault(
                r => r.EstablishmentsId == barIdent.EstablishmentsID);
            ViewBag.barId = barName.name;
            ViewBag.sample = order.Email;
            var custProfile = CustomProfile.GetUserProfile();
            if (custProfile.OwnedBar != barName.name)
            {
                //Not a match
            }
            else
            {
                //Match
            }
        }
        return View();
    }

这有什么值得担心的吗?是否有更有效的方式来执行我目前正在执行的操作?我是否应该更改引用的第一个表以包含表中的数据,我最终将其与之进行比较以避免看起来比较来自不同表的信息的低效方法?

1 个答案:

答案 0 :(得分:2)

您应该检查生成的SQL查询。你可以通过例如将查询输出到控制台,这可以通过设置db.Log = Console.Out;来完成。在您的情况下,应该有类似的方法输出到网页。 LINQ的惰性使得事情很难预测。

除此之外,如果您在表格之间创建外键关系,即OrderDetailsOrders.OrderId作为FK,您可以让生活更轻松。这将允许Entity Framework为您的数据库生成导航属性。使用它们,您的代码将如下所示:

[HttpPost]
public ActionResult Index(FormCollection sampleKey)
{
    string code = sampleKey["sampleCode"];

    var detail = db.Orders.Where(o => o.OrderCode == code && o.Active == true)
        .Select(o => new { 
            OrderCode = o.OrderCode,
            BarId = o.Drink.Establishment.Select(n => n.name),
            Sample = o.Email
            })
        .SingleOrDefault();

    if (detail != null)
    {
        ViewBag.code = detail.OrderCode;
        ViewBag.barId = detail.BarId;
        ViewBag.sample = detail.Sample;

        var custProfile = CustomProfile.GetUserProfile();
        if (custProfile.OwnedBar == detail.BarId)
        {
            //Match
        }
        else
        {
            //Not a match
        }
    }
    else
    {
        //Invalid
    }

    return View();
}