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

ラムダの解釈方法が原因である可能性があります。「Guid.Empty」を使用すると、「Guid.Empty」は最終的なラムダの一部になります。LINQ プロバイダーがこれを何らかの形で特別なケースとして扱っているのだろうか?

あなたは試すことができます:

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

しかし、実際には、Guid一部のコンパイラ生成キャプチャ クラスとは異なり、この式ツリーは同じです (どちらも lambda=>BinaryExpression=>MemberExpression を含みます)。

上記でも問題が発生する場合は、TSQL トレースをオンにするか、LINQ プロバイダーのログ記録を有効にしてみてください。

ctx.Log = Console.Out;
于 2008-12-11T05:14:15.857 に答える
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 に答える