3

我对以下代码有疑问:

    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;
        }
    }

如果我不注释掉以下行,我的 Web 应用程序在调用此方法时总是挂起:

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

知道为什么会发生这种情况吗?

4

4 回答 4

3

以下代码有效……有趣的是……知道为什么吗?

query = query.Where(row => row.InvoiceId == new Guid("00000000-0000-0000-0000-000000000000"));
于 2008-12-11T03:37:29.700 回答
0

尝试将代码更改为:

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

如果有帮助,请回帖...

于 2008-12-11T03:18:26.137 回答
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 的时候。简直太奇怪了。

于 2008-12-11T03:29:07.237 回答
0

这可能是因为 lambda 的解释方式;对于“Guid.Empty”,“Guid.Empty”是最终 lambda 的一部分。我想知道 LINQ 提供者是否以某种方式将此视为特殊情况?

你可以试试:

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

但实际上,除了Guid一些编译器生成的捕获类之外,表达式树是相同的(它们都涉及 lambda=>BinaryExpression=>MemberExpression)。

如果上述情况出现问题,请尝试启用 TSQL 跟踪,或启用您的 LINQ 提供程序日志记录 - 对于 LINQ-to-SQL,类似以下的工作(不要引用我的话!):

ctx.Log = Console.Out;
于 2008-12-11T05:14:15.857 回答