petapoco查询Sql Server视图

时间:2013-12-10 19:14:59

标签: sql dotnetnuke petapoco dotnetnuke-7

我已经开始在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:

This article似乎表明我不应该使用视图,而是使用iEnumerable的可忽略列来扩展我的产品类,这些列代表我需要的“连接”数据记录。那是准确的吗?

1 个答案:

答案 0 :(得分:4)

我已经通过几种方式完成了这项工作。

如果您不需要更新或插入视图的表格,我认为使用视图是一种很好的方法。我已成功将视图用作DAL2表,但即使它是模式绑定的,也只有GET才能工作。如果您只是阅读数据,那么这是最好的方法。

我还完成了从respoitory方法加入子数据。 在this article中(完整的源代码在相关文件部分中),我有一个基于具有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;
   }