挂着Linq查询与Guid.Empty在where表达式

时间:2008-12-11 03:13:56

标签: c# linq linq-to-sql csla

我遇到以下代码的问题:

    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

知道为什么会这样吗?

4 个答案:

答案 0 :(得分:2)

以下代码有效......有趣的是......对于为什么有任何想法?

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

答案 1 :(得分:0)

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

你可以尝试:

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

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

如果上面的抱怨,那么尝试启用TSQL跟踪,或启用LINQ-providers日志记录 - 用于LINQ-to-SQL,如下所示(不要引用我! ):

ctx.Log = Console.Out;

答案 2 :(得分:0)

尝试将代码更改为:

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

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

答案 3 :(得分: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的时候。简直就是奇怪。

豫ICP备18024241号-1