Вот мой запрос 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; }
Поскольку вы получаете ошибку таймаута при выполнении запроса LINQ, моя рекомендация заключалась бы в создании SQL для вашего запроса LINQ, а затем запустите его через профилировщик, чтобы узнать, что делает оптимизатор запросов.
var sql = ((System.Data.Objects.ObjectQuery)q).ToTraceString();
Если вы работаете с большим набором данных, тайм-аут может возникнуть из неоптимизированного соединения или, возможно, только для сервера БД, который работает на ресурсах. В любом случае профилировщик должен рассказать вам, что на самом деле происходит с таймаутом.