实体框架类,扩展EF类并添加自定义属性,iQueryable和Get方法

时间:2011-02-16 17:10:34

标签: c# linq entity-framework asp.net-mvc-2

我不知道如何标题,所以如果有人可以更恰当地重命名,那将是值得赞赏的。

我对如何填充部分实体类的自定义属性感到困惑。一些例子

// 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));

某种方式看起来有点脏......

1 个答案:

答案 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(),因此您需要先进行分页。但这应该让你开始。