2009-06-18 14 views
1

linqを使ってレコードを削除するときに奇妙な問題がありますが、それは範囲変数(source)と関係があります。linq 'range variable'の問題

FromLinqがdb_targetに拡張子方式である
var q = from source in unitOfWork.GetRepository<db_Target>().Find() 
    where source.db_TargetBase.db_Person.fk_Customer == customerID 
    select source.FromLinq(); 

public static Target FromLinq(this db_Target source) 
{ 
    return new Target 
    { 
     id = source.id, 
     LastModified = source.db_TargetBase.LastModified, 
     ... 
    } 
} 

レコードが削除された場合db_Targetdb_TargetBaseの両方が削除されたレコードを削除した後、顧客のためのすべてのターゲットは、次のステートメントを使用して取得しています。たとえば、2人のユーザーがレコードを削除しているときに、linqはuser1によって削除されたuser2のレコードを取得しようとします。db_TargetBasenullであるため、LastModified = source.db_TargetBase.LastModified行でクラッシュします。次のコードを使用している場合

問題はoccureせず、唯一の非削除されたレコードが取得されています。ここでは何が起こっている

  1. var q = from source in unitOfWork.GetRepository<db_Target>().Find() 
        where source.db_TargetBase.db_Person.fk_Customer == customerID 
        select new Target 
        { 
         id = source.id, 
         LastModified = source.db_TargetBase.LastModified, 
         ... 
        }; 
    

    これには二つの質問を生成しますか?範囲変数sourceのコピーは、私が拡張メソッドで使用しているため作成していますか?

  2. return new Targetコードを「ラップする」方法はありますか?私はこれを複数の場所で使用しており、毎回コピーしたくありません。私のコードを保守しにくくする。コードの最初のセットでは

TIA、

JJ

答えて

1

- イニシャライザは、非並進法(拡張またはその他)に住んでいるので、それは変換できない - それはローカルで実行されるように。

2番目のコードセットでは、イニシャライザはelementinit式で表され、変換されます(検証のために生成されたsqlのselect句を調べて比較します)。


あなたがこれをラップしたい場合は、Expression<Func<db_Target, Target>>その誰がつかむとthierクエリで使用することができますする必要があります。幸いなことに、それを行うのは簡単です:

var FromLinq = GetFromLinqExpressionForTarget(); 
var q = 
(
    from source in ... 
    ... 
    ... 
    select source 
).Select(FromLinq); 

は今...私は本当にここに推測上で実行されているし、私のことだけで約60%確信している:そのように使用することができる

public Expression<Func<db_Target, Target>> GetFromLinqExpressionForTarget() 
{ 
    return 
    source => new Target 
    { 
     id = source.id, 
     LastModified = source.db_TargetBase.LastModified, 
     ... 
    } 
} 

答えは正しい。だから誰かがこれを確認したいと思うなら、それは私の日を作るでしょう。 :)

+0

あなたのおかげでありがとうございました。 私は今休暇中ですが、時間があれば実装をテストし、適切なフィードバックを与えます。 – user124936