C# 挂起where表达式中Guid为空的Linq查询

C# 挂起where表达式中Guid为空的Linq查询,c#,linq,linq-to-sql,csla,C#,Linq,Linq To Sql,Csla,我对以下代码有问题: private void DataPortal_Fetch(TaskCriteria criteria) { using (var ctx = ContextManager<Gimli.Data.GimliDataContext> .GetManager(Database.ApplicationConnection, false)) { this.Ra

我对以下代码有问题:

    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.Where(row => object.Equals(row.InvoiceId, Guid.Empty))

如果有帮助,请发回…

@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时。很奇怪。

下面的代码可以工作。。。有趣的是。。。知道为什么吗

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

这可能是因为lambda是如何解释的;使用“Guid.Empty”时,“Guid.Empty”是最终lambda的一部分。我想知道LINQ提供商是否以某种方式将此视为特例

你可以试试:

Guid empty = Guid.Empty;
query = query.Where(row => row.InvoiceId == empty);
但实际上,除了
Guid
vs一些编译器生成的捕获类之外,这个类的表达式树是相同的(它们都涉及lambda=>BinaryExpression=>MemberExpression)

如果上述情况也有问题,那么请尝试启用TSQL跟踪,或者启用LINQ提供者日志记录-对于LINQ到SQL,类似于下面的方法是有效的(不要引用我的话!):


仍然挂着。。。真奇怪。我可以在LinqPad中运行相同的查询,而且效果很好。嗯,我觉得值得一试。我没有别的东西了。。很抱歉谢谢我很感激!已获取以下内容以使用新Guid(“00000000-0000-0000-0000-000000000000”)。。。而不是Guid.Empty。运行SQL Server探查器跟踪时会发生什么?这两个查询在SQL server端看起来不同吗?好问题。。。我去看看。
Guid empty = Guid.Empty;
query = query.Where(row => row.InvoiceId == empty);
ctx.Log = Console.Out;