Является ли это неэффективным способом сравнения данных в нескольких таблицах? - PullRequest
0 голосов
/ 29 февраля 2012

Я использую следующий код, чтобы сначала проверить, находится ли строка где-то в столбце в моей базе данных.Если это так, то мне нужно проверить, удовлетворяются ли несколько дополнительных критериев, просматривая различные части базы данных (можно увидеть в коде ниже).Я не уверен, если это эффективный метод для этого или есть гораздо более простой способ:

(от моего контроллера)

    [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 Ответ

2 голосов
/ 29 февраля 2012

Вы должны проверить генерируемый SQL-запрос. Вы можете сделать это, например, вывод запросов на консоль, что делается установкой db.Log = Console.Out;. В вашем случае должен быть похожий метод для вывода на веб-страницу. Ленивый характер LINQ затрудняет прогнозирование.

Кроме этого, вы могли бы значительно упростить свою жизнь, если бы вы создали отношения между внешними ключами между вашими таблицами, то есть OrderDetails имеет Orders.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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...