LINQ-to-SQLは私のPITAでした。これを使ってデータベースと通信し、WCF経由でエンティティをSilverlightアプリケーションに送信します。エンティティとその関連データの編集(CUD)を開始する時間が来るまで、すべてうまくいっていました。LINQ-to-SQL:Func <T, T, bool>を式に変換する<Func <T, T, bool>>
私は最終的にCUDを可能にする2つのforループを考案できました。私はそれらをリファクタリングしようとしました。私はいつもL2Sでラムダをすることができないことを学ぶまで、私はとても近くにいました。呼び出され
public static void CudOperation<T>(this DataContext ctx, IEnumerable<T> oldCollection, IEnumerable<T> newCollection, Func<T, T, bool> predicate)
where T : class
{
foreach (var old in oldCollection)
{
if (!newCollection.Any(o => predicate(old, o)))
{
ctx.GetTable<T>().DeleteAllOnSubmit(ctx.GetTable<T>().Where(o => predicate(old, o)));
}
}
foreach (var newItem in newCollection)
{
var existingItem = oldCollection.SingleOrDefault(o => predicate(o, newItem));
if (existingItem != null)
{
ctx.GetTable<T>().Attach(newItem, existingItem);
}
else
{
ctx.GetTable<T>().InsertOnSubmit(newItem);
}
}
}
は:
ctx.CudOperation<MyEntity>(myVar.MyEntities, newHeader.MyEntities,
(x, y) => x.PkID == y.PkID && x.Fk1ID == y.Fk1ID && x.Fk2ID == y.FK2ID);
これはほとんど働いていました。しかし、私のFuncはExpression>でなければなりません。
これが可能かどうか教えてもらえますか?
Func<T, T, bool> predicate
へ:
Expression<Func<T, T, bool>> predicate
発現は、コンパイラによって生成された私達はちょうどからのパラメータを変更するため、SharePointの2010
Porgesを、私は迅速な対応に感謝しています。しかし、あなたがそれをし、私の.Where節をctx.GetTable()に変更すると、どこか(述語)、私はコンパイルできません。私は2つの変数(プロパティを比較する必要がある)をExpression/Funcに渡す必要があります。 –
DaleyKD
ああ、わかった、あなたの実際の問題は方法内にある。私はそれを逃した - 私は答えを更新します。 – porges
聖なる煙!それは完全に働いた。おそらく、バージョン1.1のパフォーマンスについてこれを再検討します。 ;) ありがとうございました! – DaleyKD