5

さて、Customer オブジェクト モデルを受け取る、厳密に型指定された Customer "Details" ビューがあります。

私は LINQ to SQL を使用しており、すべての顧客が複数の (駐車場) スペースを持つことができます。

これはデータベース内の FK 関係であるため、LINQ で生成された Customer モデルには "Spaces" コレクションがあります。すごい!

これは CustomerRepository のコード スニペットで、顧客の駐車スペースを繰り返し処理して、すべての支払い、駐車スペース、最後に顧客を削除します。

public void Delete(Customer customer)
{
    foreach (Space s in customer.Spaces)
        db.Payments.DeleteAllOnSubmit(s.Payments);
    db.Spaces.DeleteAllOnSubmit(customer.Spaces);
    db.Customers.DeleteOnSubmit(customer);
}

すべてが期待どおりに機能します!

「詳細」ビューで、テーブルに顧客のスペースを入力します。

<% foreach (var s in Model.Spaces)
   { %>
    <tr>
        <td><%: s.ID %></td>
        <td><%: s.InstallDate %></td>
        <td><%: s.SpaceType %></td>
        <td><%: s.Meter %></td>
    </tr>
<% } %>

次のエラーが表示されます。

'System.Data.Linq.EntitySet' には 'GetEnumerator' のパブリック定義が含まれていないため、foreach ステートメントは 'System.Data.Linq.EntitySet' 型の変数を操作できません。

最後に、このコードを Customer 部分クラスに追加し、ビューで foreach を使用して ParkingSpaces を反復処理すると、すべてが期待どおりに機能します。

public IEnumerable<Space> ParkingSpaces
{
    get
    {
        return Spaces.AsEnumerable();
    }
}

ここでの問題は、繰り返したくないということです。ViewModel を使用して Spaces コレクションを View に渡すことも考えていましたが、LINQ は既に Customer モデルの Spaces プロパティを推測して作成しているので、それを使用するのが最もクリーンだと思います。

私は単純なものを見逃していますか、それとも間違ってアプローチしていますか?

ありがとう!

4

4 に答える 4

14

これに答えるのが少し遅れて申し訳ありませんが、問題を解決する正しい方法は、アセンブリ参照を web.config ファイルに追加して、ビューが GetEnumerator() メソッドにアクセスできるようにすることです。これは、ページ コンパイル エラーで提供されるアセンブリ参照文字列を使用して行うことができます。例えば

<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

于 2010-05-20T15:43:07.653 に答える
1

あなたの小さなヘルパーの方法以外に、あなたがそれをすることができる2つの方法があります。

次のページで、クラスのIEnumerableを継承できます。

<%@ Page Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Space>>" %>

<% foreach (var item in Model)
   {

または、エンティティオブジェクトをIEnumerableにキャストできます。

<% foreach (var item in Model.Spaces as IEnumerable<Space>)
   {
于 2010-04-25T23:51:08.943 に答える
1
  • まず、DTOに直接アクセスする代わりにビューモデルを使用することをお勧めします。(これにはAutomapperを使用します)

  • 次に、ビューをビューモデルに強く入力し、ビューモデルでIEnumerableまたはリストをビューに渡してから反復できます。

于 2010-04-25T23:53:02.353 に答える
1

プロジェクトへの参照を追加するだけSystem.Data.Linqです。

于 2010-09-29T19:03:21.440 に答える