Internet Explorer отстает от источника данных IQueryable. Firefox и Chrome A-OK. Видео доказательство поставляется - PullRequest
3 голосов
/ 18 января 2010

Я бы хотел сказать, что это запрос, но это не так. Даже когда мы пошагово проходим, запросы завершаются без проблем. Даже метод .DataBind () не появляется, чтобы вызвать задержку.

Вот как я знаю, что это связано с моим IQueryable в качестве источника привязки:

Старый код:

  1. Вызвать хранимую процедуру с помощью SqlCommand и использовать SqlAdapter для заполнения новой таблицы данных.
  2. DataTable будет отправлен в метод для каждого DropDownList. (Есть 5 DDL)
  3. Каждый метод будет передавать строки таблицы данных (да, каждая из них) в IEnumerable.
  4. Несколько запросов LINQ будут выполняться к IEnumerable, чтобы отфильтровать нужные нам параметры, включая .Distinct (IEqualityComparer) и .Sort (x => x ["RowName"]); (Опять же, каждый из методов будет выполнять это).
  5. Новый объект DataTable будет создан с помощью IEnumerable.CopyToDataTable () (да, опять же, каждый метод)
  6. DropDownList.DataSource будет установлен в новый DataTable, а затем будет .DataBind ().

Эта ужасная пародия на код очень быстро закончится в IE. Возможно, секунду или две времени на обдумывание.

Вот новый код во плоти:

IQueryable<Expose_LotRuns> elr = DB.Expose_LotRuns;

if (iTechID > 0)
    elr = elr.Where(x => x.Master_LotRuns.Flows.CD_Techs.ID == iTechID);

if (iFlowID > 0)
    elr = elr.Where(x => x.Master_LotRuns.Flows.ID == iFlowID);

if (iToolID > 0)
    elr = elr.Where(x => x.Master_LotRuns.Tools.ID == iToolID);

if (iOperationID > 0)
    elr = elr.Where(x => x.Master_LotRuns.Operations.ID == iOperationID);

if (iReticleID > 0)
    elr = elr.Where(x => x.Reticles.ID == iReticleID);

var techs = from x in elr
                        where (x.Master_LotRuns.Flows.CD_Techs != null)
                        group x by new
                        {
                            x.Master_LotRuns.Flows.CD_Techs.ID,
                            x.Master_LotRuns.Flows.CD_Techs.Technology
                        } into y
                        orderby y.Key.Technology
                        select new { y.Key.ID, y.Key.Technology };

var flows = from x in elr
                        //where (x.Master_LotRuns.Flows != null)
                        group x by new
                        {
                            x.Master_LotRuns.Flows.ID,
                            x.Master_LotRuns.Flows.Flow
                        } into y
                        orderby y.Key.Flow
                        select new { y.Key.ID, y.Key.Flow };

var tools = from x in elr
                        //where (x.Master_LotRuns.Tools != null)
                        group x by new
                        {
                            x.Master_LotRuns.Tools.ID,
                            x.Master_LotRuns.Tools.Tool
                        } into y
                        orderby y.Key.Tool
                        select new { y.Key.ID, y.Key.Tool };

var ops = from x in elr
                    //where (x.Master_LotRuns.Operations != null)
                    group x by new
                    {
                        x.Master_LotRuns.Operations.ID,
                        x.Master_LotRuns.Operations.Operation
                    } into y
                    orderby y.Key.Operation
                    select new { y.Key.ID, y.Key.Operation };

var rets = from x in elr
                     //where (x.Reticles != null)
                     group x by new { x.Reticles.ID, x.Reticles.Reticle } into y
                     orderby y.Key.Reticle
                     select new { y.Key.ID, y.Key.Reticle };

ddlTechs.DataTextField = "Technology";
ddlTechs.DataValueField = "ID";
ddlTechs.DataSource = techs;
ddlTechs.DataBind();
ddlTechs.Items.Insert(0, new ListItem("Any", "0"));

ddlFlows.DataTextField = "Flow";
ddlFlows.DataValueField = "ID";
ddlFlows.DataSource = flows;
ddlFlows.DataBind();
ddlFlows.Items.Insert(0, new ListItem("Any", "0"));

ddlTools.DataTextField = "Tool";
ddlTools.DataValueField = "ID";
ddlTools.DataSource = tools;
ddlTools.DataBind();
ddlTools.Items.Insert(0, new ListItem("Any", "0"));

ddlOpers.DataTextField = "Operation";
ddlOpers.DataValueField = "ID";
ddlOpers.DataSource = ops;
ddlOpers.DataBind();
ddlOpers.Items.Insert(0, new ListItem("Any", "0"));

ddlReticles.DataTextField = "Reticle";
ddlReticles.DataValueField = "ID";
ddlReticles.DataSource = rets;
ddlReticles.DataBind();
ddlReticles.Items.Insert(0, new ListItem("Any", "0"));

Теперь, если вы посмотрите следующее видео, вы увидите, что приведенный выше код очень хорошо работает как в Firefox, так и в Chrome, и все же он работает в MS IE. Обычно я был бы счастлив, потому что я не использую IE, но IE - это политика компании. Также стоит упомянуть, что задержка происходит только для первого DDL, но не для любого из последующих выборов. Кроме того, начальная загрузка (которая загружает все данные, не ограничиваясь, используя одни и те же методы) также не занимает много времени для загрузки.

http://www.youtube.com/watch?v=-3QyNj87BSQ

Некоторые пожалуйста, ПОЖАЛУЙСТА, скажите мне, почему IE ведет себя так, и что я могу сделать, чтобы это исправить. Кстати, это так же плохо работает в IE7 и IE8

Ответы [ 2 ]

5 голосов
/ 18 января 2010

Во-первых, нет ничего плохого в коде, который вы включили в вопрос в этом контексте, поскольку он не работает в IE. Это связано с кодом обратной передачи ASP.NET UpdatePanel, который иногда имеет проблемы с IE, особенно с выпадающими списками со многими строками. Смотрите это .

Чтобы отладить подобные проблемы, вы можете прикрепить Profiler (IE8 имеет один) и посмотреть, какая функция выполняется долго. Если вы также подключите сетевой монитор, такой как HTTPWatch или Fiddler, вы сможете узнать, сколько времени занимает ответ сервера. В этом случае я очень сомневаюсь, что проблема с серверным временем.

1 голос
/ 18 января 2010

Другой отправленный пользователь прав, и как другой ответ переполнения стека решил проблему с этим в Internet Explorer .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...