我已经开始在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
This article似乎表明我不应该使用视图,而是使用iEnumerable的可忽略列来扩展我的产品类,这些列代表我需要的“连接”数据记录。那是准确的吗?
答案 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;
}