2014-09-30 1 views
0

У меня есть класс модели:Как проверить аккуратный способ, если коллекция содержит объект, одно свойство которого равно объекту, переданному в метод Содержит?

public class AuthorizationToView { 
     public int Id { get; set; } 
     public virtual Person CustomerToVisit { get; set; } 
     public virtual ApplicationUser User { get; set; } 
     public DateTime TimeStamp { get; set; } 
    } 

ApplicationDbContext db обладает свойством: public DbSet<AuthorizationToView> AuthorizationsToView { get; set; }

И ApplicationUser имеет свойство public virtual ICollection<AuthorizationToView> PersonsPermittedToView { get; set; }

ВОПРОС: Теперь в одном месте в коде, я стараюсь чтобы проверить, есть ли у user внутри гиста public virtual ICollection<AuthorizationToView> PersonsPermittedToView { get; set; } a AuthorizationToView, у которого есть определенные Person as свойство, а если не вернуть BadRequest.

Я стараюсь это:

if (User.IsInRole("RegularUser")) { 
       var user = UserManager.FindById(User.Identity.GetUserId()); 
       if (!user.PersonsPermittedToView.Contains(new AuthorizationToView { CustomerToVisit = person })) { 
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
       }    
      } 

, но, к сожалению, !user.PersonsPermittedToView.Contains(new AuthorizationToView { CustomerToVisit = person }) всегда верно.

Я мог бы переопределить метод Equals, но я боюсь, что он смутит Entity Framework.

+0

Я думаю, вам лучше использовать '.Any()' вместо '.Contains()' – DavidG

+0

@DavidG Не могли бы вы показать, как? Я думал, что я могу использовать LINQ, но не знаю, как в этом случае. – Yoda

ответ

3

Предполагая Person имеет первичный ключ свойство Id, это то, как я бы добиться того же:

if (User.IsInRole("RegularUser")) 
{ 
    var user = UserManager.FindById(User.Identity.GetUserId()); 

    if (!user.PersonsPermittedToView.Any(pptv => 
       pptv.CustomerToVisit.PersonToVisit.Id == person.Id)) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
} 
1

Вы могли бы просто сравнить человека непосредственно, а не создавать новую AuthorizationToView, как это:

if (!user.PersonsPermittedToView.Select(a=>a.CustomerToVisit).Contains(person)) 
{ 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
} 

Или, если вы на самом деле должны проверять на Id, используйте:

if (!user.PersonsPermittedToView.Select(a=>a.CustomerToVisit.Id).Contains(person.Id)) 
{ 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
} 
Смежные вопросы