我不知道如何标题,所以如果有人可以更恰当地重命名,那将是值得赞赏的。
我对如何填充部分实体类的自定义属性感到困惑。一些例子
// partial class from EF base class - base class contains
// properties such as commentID, comment, userID etc
// Comments.cs
public partial class Comment {
public int UpVotes { get; set; }
public int DownVotes { get; set; }
public int CurrentVotes()
{
return UpVotes - DownVotes;
}
}
_
//CommentRepository.cs
//snip
public Comment GetItem(int id)
{
Comment c = db.Comments.SingleOrDefault(x => x.CommentID == id);
c.UpVotes = 0 //get UpVotes
c.DownVotes = 0 // get DownVotes
return c;
}
public IQueryable<Comment> GetAllCommentsByPage(int pageid)
{
}
public IQueryable<Comment> GetAllCommentsByPage(string slug)
{
}
public IQueryable<Comment> GetCommentSelection(int PageID, int Skip, int Take)
{
}
public int CountCommentByPage(int PageID)
{
}
在旧的.Net 1.x天,我会让GetAllx方法选择一个CommentID列表,然后使用List.Add(GetItem(ID))填充一个新的List。
在EF4中,我想做类似的事情,但不要因为IQueryables的延迟执行而失败 在几个实例中,我发现在执行最终.ToList()或类似操作之前,快速连续堆叠这些GetAllx方法很有用,以获取实际数据。
我有理由做我希望相当简单并且逃避我的事情吗?我不想改变每个方法来返回可以通过一个GetItem方法生成的静态项目列表。
提前致谢。
-----编辑-----
好的,这是我目前的解决方案:
public List<Comment> IQueryable2ToList(IQueryable<Comment> c)
{
List<Comment> comments = new List<Comment>();
List<int> ids = c.Select(x => x.CommentID).ToList();
foreach (int id in ids) {
comments.Add(GetComment(id));
}
return comments;
}
我打算这样做:
List<Comment> comments = (new CommentRepository()).IQueryable2ToList(db.FindAllCommentsByPage(slug));
某种方式看起来有点脏......
答案 0 :(得分:1)
好吧,你可以消除n + 1选择:
public List<Comment> IQueryable2ToList(IQueryable<Comment> comments)
{
List<Comment> comments = comments.ToList()
foreach (Comment c in comments) {
c.UpVotes = 0 //get UpVotes
c.DownVotes = 0 // get DownVotes
}
return comments;
}
但是,这不是我要做的。相反,我会做一个演示模型和项目:
public class CommentPresentation {
public int CommentID { get; set; }
public string WittyInsight { get; set; }
public int UpVotes { get; set; }
public int DownVotes { get; set; }
public int CurrentVotes()
{
return UpVotes - DownVotes;
}
}
public IQueryable<CommentPresentation> ToPresentation(IQueryable<Comment> comments)
{
return from c in comments
select new CommentPresentation
{
CommentId = c.CommentId,
WittyInsight = c.WittyInsight,
UpVotes = 0,
DownVotes = 0
};
}
如果要分配常量以外的其他内容,可能需要经过AsEnumerable()
,因此您需要先进行分页。但这应该让你开始。