1

我正在使用 Rob Connery 的 Subsonic ORM 和 Backbone.Js 来构建 javascript 单页演示应用程序。在一个服务端点中,有一个合同发送数据源中存在的所有记录,如下所示

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public TaskCollection GetAllTasks()
{
    TaskCollection coll = new TaskCollection();
    coll.Load();
    return coll;
}

但似乎Task集合中的每一个都被大量仅在服务器端需要的属性所污染。这是根据请求返回的 JSON

[{
    "__type": "DAL.Task",
    "Taskid": 1,
    "Taskname": "welcome to india",
    "Createdon": "\/Date(1334591056903)\/",
    "Modifiedon": "\/Date(1334591056903)\/",
    "ValidateWhenSaving": true,
    "DirtyColumns": [],
    "IsLoaded": true,
    "IsNew": false,
    "IsDirty": false,
    "TableName": "task",
    "ProviderName": null,
    "NullExceptionMessage": "{0} requires a value",
    "InvalidTypeExceptionMessage": "{0} is not a valid {1}",
    "LengthExceptionMessage": "{0} exceeds the maximum length of {1}",
    "Errors": []
}]

我只需要 CreatedOn,ModifiedOn 和 TaskName, TaskId 。我如何确保使用 SubSonic ORM 仅将这些发送到线路上

4

2 回答 2

1

这里有几个想法......

使用视图模型自动选择属性:

public class TaskView
{
    public int TaskID { get; set; }
    public string TaskDescription { get; set; }
}
...
var results = new Select().From(Tables.Task).ExecuteTypedList<TaskView>();

使用匿名类型

var qry = new Select(new string[] { Task.Columns.TaskID, Task.Columns.TaskDescription }).From(Tables.Task);
var resultList = new List<object>();
using (IDataReader rdr = qry.ExecuteReader())
{
    while (rdr.Read())
        resultList.Add(new 
        {
            TaskID = rdr[0].ToString(),
            TaskDescription = rdr[1].ToString(),
        });
}
于 2012-04-17T01:01:03.827 回答
0

我不使用 SubSonic,但我不得不承认这似乎是一个很好的例子,说明您可能希望在哪里使用 ViewModel,即从您的模型中专门为视图填充的模型。现在就将 ViewModel 绑定到模型,和/或可能从视图的模型中为许多 ViewModel 生成属性(因为对于一堆模型来说,生成 ViewModel 肯定是乏味且容易出错的),好吧,我听说了的几种通用解决方案。我实际上是在尝试找到一个我对自己满意的解决方案;与此同时,我被迫手写它们,直到找到更好的解决方案。我相信如果您想要强类型的 ViewModel,您可以使用 AutoMapper 之类的工具,尽管我自己从未使用过它。一世'

我使用 ViewModels 的主要原因是我可以轻松控制日期的格式。但使用不同的 JSON 序列化程序可能会做得更好。当然,使用 ViewModels 还可以让您灵活地根据需要更改数据层。但我不得不承认,这很乏味。我认为通过一些自动化可以更好地处理我的实现,但到目前为止我不知道如何处理。

我意识到这只是部分答案。我很好奇可能会出现什么其他答案。

于 2012-04-16T16:52:58.253 回答