3

LinqToSQLで生成されたデータコンテキストから継承しようとしています-このようなもの

public class myContext : dbDataContext {
 public System.Data.Linq.Table<User>() Users {
  return (from x in base.Users() where x.DeletedOn.HasValue == false select x);
 }
}

しかし、私のLinqステートメントはテーブルにキャストできないIQueryableを返します-Linq.Tableの内容を制限する方法を知っている人はいますか-ユーザーテーブルにアクセスする場所で、削除済みとマークされたものが返されないことを確認しようとしています。おそらく私はこれについてすべて間違っていると思います-どんな提案でも大歓迎です。

ハル

4

8 に答える 8

2

別のアプローチは、ビューを使用することです..

CREATE VIEW ActiveUsers as SELECT * FROM Users WHERE IsDeleted = 0

linq to sql に関する限り、それはテーブルと同じです。DeletedOn フィルタリングが必要なテーブルについては、フィルターを使用するビューを作成し、それをデータ コンテキストのテーブルの代わりに使用します。

于 2008-09-17T18:09:58.770 に答える
1

開発者がクエリでテーブルを使用しないように、DataContext をカプセル化します。私のリポジトリには、必要なものと同様のフィルタリングを行う「すべて」のプロパティがあります。したがって、クエリは次のようになります。

from item in All
where ...
select item

すべてが次のようになります。

public IQueryable<T> All
{
    get { return MyDataContext.GetTable<T>.Where(entity => !entity.DeletedOn.HasValue); }
}
于 2008-09-18T01:17:46.340 に答える
1

テーブルで識別子列の継承を使用できます。識別子列がどちらに行くかを示す DeletedUsers テーブルと ActiveUsers テーブル。次に、コードで、Users.OfType ActiveUsers を参照するだけで、削除されたものは含まれません。

補足として、マークダウンでこれをどのように行うのですか?

Users.OfType<ActiveUsers>

コードで取得できますが、インラインでは取得できません

于 2008-09-17T17:15:49.570 に答える
0

ビューに表示されない関係/関連付けに関する問題が見つかりました。スキーマからその情報を抽出できないため、dbml の各クラスを調べてビューの主キーを設定する必要があるようです。私は現在、主キーを設定する過程にあり、削除されていないアイテムのみを分離するために表示ルートに進むことを計画しています。

ありがとう、後でもっと更新します。

于 2008-09-18T13:50:38.243 に答える
0

アソシエーションで使用するビューがいくつかありますが、それらは他のリレーションシップと同じように表示されます。関連付けを手動で追加する必要がありました。私が提案できる唯一のことは、これらのクラスと関連付けに対して生成されたプロパティと装飾された属性を調べることです。

同じリレーションシップを持ついくつかのテーブルを追加し、それらを表示されていないビューと比較します。

また、サーバー エクスプローラー接続の更新が正しく機能していないように見え、最初はエンティティが正しく作成されないことがあります。これは、エンティティをデザイナーから削除し、プロジェクトを閉じてから、プロジェクトを再度開き、サーバーから再度追加する場合を除きます。冒険者。これは、linq to sql .dbml デザイナーで Visual Studio 2008 を使用していることを前提としています。

于 2008-09-17T23:15:32.857 に答える
0

削除済みとしてマークされていないすべてのレコードについて、テーブル内のマップされたすべての列を返すストアド プロシージャを使用してから、LINQ to SQL クラスをストアド プロシージャの結果にマップできます。サーバー エクスプローラーのストアド プロシージャを LINQ to SQL デザイナーのクラスにドラッグ アンド ドロップするだけだと思います。

于 2008-09-17T17:19:20.623 に答える
0

おそらく、Keven sheffield の応答に対する私のコメントは、私が達成しようとしていることを明らかにするかもしれません。

私はほとんどのデータ アクセスに同様のリポジトリを持っていますが、実際に追加のメソッドを呼び出すことなく、リレーションシップをトラバースし、DeletedOn ロジックを維持できるようにしようとしています。オブジェクトは、メソッド (小道具/フィールドのみ) を呼び出すことができない StringTemplate プロセッサによって照会されます (スペルが修正されます)。

最終的には、アプリケーション内のすべてのテーブルに対して、この DeletedOn フィルタリングが必要になります。Scott Nichols から継承されたクラス ソリューションは機能するはずですが (約 30 のテーブルのクラスとリレーションシップを派生させる必要がありますが)、Derived Class Discriminator Value プロパティで null 値をチェックする方法を理解する必要があります。

StringTemplate 処理専用にすべてのクラスを拡張し、必要な関係のプロパティを明示的に追加することになるかもしれません。StringTemplate を [ユーザー] にスローして、すべてを処理できるようにしたいだけです。

于 2008-09-17T17:49:27.710 に答える
0

この状況で私がしたことは、IQueryable を返すリポジトリ クラスを作成したことですが、基本的には

_db.Table の t から t を
選択します。

これは通常、tableRepository.GetAllXXX(); によって参照されます。しかし、あなたは tableRepository.GetAllNonDeletedXXX(); を持つことができます。削除された行を取り出すための予備の where 句を挿入します。これにより、削除されたもの、削除されていないもの、およびすべての行をさまざまな方法で取り戻すことができます。

于 2008-09-17T17:26:22.773 に答える