Выполнение запроса LINQ / ошибка зависит от одного произвольного оператора присваивания

1

Вот мой запрос LINQ в С#:

var q =
    from a in context.tableA.Where(s => s.field1 == id)    //I'm querying by "id"
    from b in context.tableB.Where(s => s.field1 == a.field1)
    from c in context.tableC.Where(s => s.field2 == b.field2).DefaultIfEmpty() //left join
    from d in context.tableD.Where(s => s.field3 == b.field3).DefaultIfEmpty()
    from e in context.tableE.Where(s => s.field4 == b.field4).DefaultIfEmpty()

    select new CustomObject()
    {
        CustomObject_fieldA = a.someField,
        CustomObject_fieldB = b.someField,

            //some other fields assigned...

        CustomObject_fieldC = c.someField,
        CustomObject_fieldD = d.someField,
        CustomObject_fieldE = e.someField     // <-- THIS LINE
    }

Поэтому для пояснения мои таблицы структурированы следующим образом:

tableA:    int field1
tableB:    int field1   int field2   int field3   int field4
tableC:                 int field2
tableD:                              int field3
tableE:                                           int field4

МОЯ ПРОБЛЕМА

Если я прокомментирую THIS LINE запрос будет успешным.

Если я оставлю THIS LINE раскомментировать, то запрос будет висеть, и дать EntityCommandExecutionException ошибку (а Timeout expired ошибки).

Поскольку я выполняю левые соединения, я знаю, что e может быть NULL. Но я сделал несколько тестов, которые говорят мне, что это не вызывает ошибки.

--TEST 1--

Во-первых, закомментируйте THIS LINE. Тогда c и d могут быть или не быть NULL, и запрос будет успешным независимо от того, являются ли c или d NULL.

--TEST 2--

Раскомментируйте THIS LINE. Независимо от того, является ли e NULL или нет, запрос всегда будет терпеть неудачу (висеть с приведенной выше ошибкой).

ВОПРОС

Я провел много испытаний и сузил успех/неудачу (зависание) в зависимости от комментария или раскола THIS LINE.

Кто-нибудь знает, почему это происходит и как это исправить?

EDIT для уточнения

// in the CustomObject.cs file, some of the properties are
public string CustomObject_fieldA { get; set; }
public string CustomObject_fieldB { get; set; }
public string CustomObject_fieldC { get; set; }
public string CustomObject_fieldD { get; set; }
public string CustomObject_fieldE { get; set; }
  • 0
    Да, это свойство с сеттером, см. Мое редактирование внизу. И нет, единственная цель - сохранить это значение.
  • 0
    Какие типы данных для field2 , field3 и field4 ?
Показать ещё 1 комментарий
Теги:
linq
entity-framework
join
left-join

1 ответ

0

Поскольку вы получаете ошибку таймаута при выполнении запроса LINQ, моя рекомендация заключалась бы в создании SQL для вашего запроса LINQ, а затем запустите его через профилировщик, чтобы узнать, что делает оптимизатор запросов.

var sql = ((System.Data.Objects.ObjectQuery)q).ToTraceString();

Если вы работаете с большим набором данных, тайм-аут может возникнуть из неоптимизированного соединения или, возможно, только для сервера БД, который работает на ресурсах. В любом случае профилировщик должен рассказать вам, что на самом деле происходит с таймаутом.

  • 0
    Я понимаю, что это не обязательно отвечает на вопрос напрямую, но мне не хватает представителя, чтобы добавить выше в качестве комментария. Если OP делает то, что я предлагаю, он / она, вероятно, обнаружит проблему с запросом LINQ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню