1

dotnetnuke 7 で DAL2 の使用を開始しました。インスタンスが使用する SQL サーバー データベースでビューを作成した複雑なクエリがいくつかあります。これらのビューから単純な選択にアクセスするためのベスト プラクティスは何ですか。

以下を使用すると、dbOwner と ObjectQualifier がバイパスされます。

    Public Function GetProducts_Short_Active() As IEnumerable(Of Object)
        Using ctx As IDataContext = DataContext.Instance
            Return ctx.ExecuteQuery(Of Object)(CommandType.Text, "SELECT * FROM dbo.vw_ProductList_Short_Active", Nothing)
        End Using
    End Function

質問: または、以下のようにビューの名前であるテーブル名注釈を使用して、(各テーブルに対して行ったように) 各 sql-server-view に対してクラスとプロパティを定義する必要がありますか?

<TableName("vw_ProductList_Short_Active")> _
<PrimaryKey("ProductId")> _
<Cacheable("ProductList_Short_Active", CacheItemPriority.Default, 20)> _
<Scope("PortalId")>
Public Class ProductList_Short_Active
     ''view properties go here
End Class

編集1:

この記事は、ビューを使用するべきではなく、必要な「結合された」データ レコードを表す iEnumerable の無視可能な列を使用して製品クラスを拡張することを示しているようです。それは正確ですか?

4

1 に答える 1

5

私はこれをいくつかの方法で行いました。

ビューのテーブルを更新または挿入する必要がない場合は、ビューを使用するのが良い方法だと思います。ビューを DAL2 テーブルとして正常に使用できましたが、スキーマにバインドされている場合でも、GET のみが機能します。データを読み取るだけの場合は、それが最善の方法です。

また、リポジトリメソッドから子データを結合することも行いました。この記事(完全なソース コードは「関連ファイル」セクションにあります) では、ignorecolumn 属性を持つテーブルに基づく DAL2 オブジェクトを使用しています。

[TableName("DNNuclear_DataVisualizer_Chart")]
[PrimaryKey("ChartId", AutoIncrement = true)]
[Cacheable("Charts", CacheItemPriority.Default, 20)]
[Scope("ModuleId")]
public class Chart
{
    ///<summary>
    ///</summary>
    public int ChartId { get; set; }
...
    [IgnoreColumn]
    public IList<SeriesData> SeriesData { get; set; }
...

}

その属性は、DAL2 リポジトリ メソッドで入力されます。

   public Chart GetItem(int itemId)
   {
       Chart t;
       using (IDataContext ctx = DataContext.Instance())
       {
           var rep = ctx.GetRepository<Chart>();
           t = rep.GetById(itemId);
           var repD = ctx.GetRepository<ChartData>();
           var data = repD.Get(itemId);
           if (data != null && data.Count() > 0)
           {
               // Get unique categories
               var uniqueCategories = data.OrderBy(x => x.Category).Select(x => x.Category).Distinct();
               t.Categories = uniqueCategories.ToList();

               // Get series data
               t.SeriesData = getSeriesData(data, t.Categories.ToArray<string>());
           }
       }
       return t;
   }
于 2013-12-11T13:29:57.820 に答える