petapoco 查询一个 Sql Server 视图

J K*_*ing 1 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
Run Code Online (Sandbox Code Playgroud)

问题: 或者我应该为每个 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
Run Code Online (Sandbox Code Playgroud)

编辑 1:

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

小智 5

我已经通过几种方式做到了这一点。

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

我还通过从 respoitory 方法加入子数据来做到这一点。在本文中(完整源代码在相关文件部分),我有一个基于具有 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; }
...
Run Code Online (Sandbox Code Playgroud)

}

该属性在 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;
   }
Run Code Online (Sandbox Code Playgroud)