Классы Entity Framework, расширение классов EF и добавление пользовательских свойств, iQueryable и метод Get - PullRequest
1 голос
/ 16 февраля 2011

Я в растерянности относительно того, как озаглавить это, так что, если кто-то сможет переименовать это более правильно, это будет оценено.

Я застрял в том, как я могу заполнить пользовательские свойствакласса частичных сущностей.Некоторые примеры

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

В EF4 я хочу сделать подобное, но не потерять в отложенном выполнении IQueryables.
В нескольких случаях я нашел это полезнымбыстро сложить эти методы GetAllx перед окончательным .ToList () или аналогичным, чтобы получить фактические данные.

Есть ли для меня разумный способ сделать то, что, я надеюсь, довольно просто и ускользает от меня?Я бы не хотел менять каждый метод, чтобы он возвращал статический список элементов, которые могут быть сгенерированы одним методом GetItem.

Заранее спасибо.

----- edit -----

Хорошо, вот решение, которое у меня есть на данный момент:

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 Ответ

1 голос
/ 17 февраля 2011

Ну, вы можете исключить 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(), так что сначала вы захотите выполнить подкачку. Но это должно помочь вам начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...