2008-12-11 5 views
3

У меня возникли проблемы со следующим кодом:висячие Linq запрос с Guid.Empty в котором выражение

private void DataPortal_Fetch(TaskCriteria criteria) 
    { 
     using (var ctx = ContextManager<Gimli.Data.GimliDataContext> 
        .GetManager(Database.ApplicationConnection, false)) 
     { 
      this.RaiseListChangedEvents = false; 
      this.IsReadOnly = false; 

      IQueryable<Data.Task> query = ctx.DataContext.Tasks; 

      if (criteria.ReadyForPricing) 
      { 
       query = query.Where(row => row.IsPriced != true); 
       query = query.Where(row => row.Status == (int)TaskStatus.Closed); 
       query = query.Where(row => row.InvoiceId == Guid.Empty); 
      } 

      if (criteria.ReadyForInvoicing) 
      { 
       query = query.Where(row => row.IsPriced == true); 
       query = query.Where(row => row.Status == (int)TaskStatus.Closed); 
       query = query.Where(row => row.InvoiceId == Guid.Empty); 
      } 

      var data = query.Select(row => TaskInfo.FetchTaskInfo(row)); 

      this.AddRange(data); 

      this.IsReadOnly = true; 
      this.RaiseListChangedEvents = true; 
     } 
    } 

Мой веб-приложение, когда он вызывает этот метод, всегда свисает, если я не комментирую выведите следующую строку:

query = query.Where(row => row.InvoiceId == Guid.Empty 

Любая идея, почему это происходит?

ответ

2

Следующий код работает ... достаточно интересно ... любая идея о том, почему?

query = query.Where(row => row.InvoiceId == new Guid("00000000-0000-0000-0000-000000000000")); 
0

Попробуйте изменить код:

query.Where(row => object.Equals(row.InvoiceId, Guid.Empty)) 

сообщение обратно, если это помогло ...

+0

Спасибо! Я попробую! – mattruma 2008-12-11 03:29:18

+0

По-прежнему висит ... действительно странно. Я могу запустить тот же запрос в LinqPad, и он работает отлично. – mattruma 2008-12-11 03:29:51

+0

Хм, подумал, что это стоит того. Я больше ничего не получил .. извините! – BFree 2008-12-11 03:37:22

0

@BFree ... Пробовал, что вы предложили ... и до сих пор делают то же самое. Это странно, я могу запустить следующий код в LINQPad без проблем:

from t in Tasks 
where t.IsPriced == false 
&& t.IsNotInvoiceable == false 
&& t.Status == 5 
&& t.InvoiceId == Guid.Empty 
select t 

Как я могу использовать следующую строку кода с не проблемы либо:

if (criteria.ProjectId != Guid.Empty) 
    query = query.Where(row => row.ProjectId == criteria.ProjectId); 

Это просто, когда я использую Guid.Empty. Просто странно.

0

Это может быть из-за интерпретации лямбда; с «Guid.Empty», «Guid.Empty» является частью окончательной лямбда. Интересно, рассматривает ли LINQ-провайдер это как особый случай?

Вы можете попробовать:

Guid empty = Guid.Empty; 
query = query.Where(row => row.InvoiceId == empty); 

Но на самом деле, другие, чем Guid против некоторого сгенерированного компилятором класса захвата, выражение дерево это то же самое (они оба связаны с лямбда => BinaryExpression => MemberExpression).

Если выше также жалуется, а затем попытаться положить TSQL след на, или как включить ведение журнала LINQ-провайдеров - для LINQ к SQL, то, как показано ниже работы (не цитируйте меня!):

ctx.Log = Console.Out;