2015-09-18 1 views
0

Допустим, у меня есть три таблицы (Person_tbl, PersonHobbies_tbl и Hobbies_tbl) с отношениями между ними, как:Обратный результат partion из списка с помощью Entity Framework и ASP.NET MVC

Person_tbl [1]-------[n] PersonHobbies_tbl [n]-------[1] Hobbies_tbl 

Логика заключается в том, что у конкретного человека может быть больше увлечений. Я хочу получить список хобби, которые не назначены конкретному человеку, представленному его идентификатором.

Например, если я хочу, чтобы получить список хобби, которое присваивается конкретному человеку, я могу это сделать, как:

DBEntity db = new DBEntity(); 

var Person = db.Person_tbl.Find(id); //id contains the ID of a person 
var obj = Person.PersonHobbies_tbl; 

//lets say that ViewListResult cointains only HobbyName 
return obj.Select(n => new ViewListResult 
{ 
    HobbyName= n.Hobbies_tbl.name 
}).ToList(); 

Я хочу, чтобы получить обратное этого (список с остальными хобби) эффективным способом.

Так что мой вопрос в том, как я могу решить свою проблему достаточно эффективно?

ответ

1

Быстрое тестирование linqpad, которое должно получить то, что вам нужно.

void Main() 
{ 
    var hobbies = new List<Hobby>() 
    { 
     new Hobby { ID = 1, Name = "Test 1" }, 
     new Hobby { ID = 2, Name = "Test 2" }, 
     new Hobby { ID = 3, Name = "Test 3" }, 
     new Hobby { ID = 4, Name = "Test 4" } 
    }; 

    var ids = new[] { 2, 3 }; 

    var rest = hobbies.Where(x => !ids.Contains(x.ID)).ToList(); 
    rest.Dump(); 
} 

public class Hobby 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 


ID Name 
1 Test 1 
4 Test 4 
1

Вы можете использовать Except исключить увлечения человека от всех увлечений:

var obj = db.Hobbies_tbl.Except(Person.PersonHobbies_tbl); 

Я думаю, что с помощью Except имеет лучшую производительность, чем Contains, потому что есть какой-то внутренний HashSet используется для реализации исключая операции ,

+0

Это, кажется, лучшее решение, но ваш код не является хорошим, потому что 'Hobbies_tbl' и' PersonHobbies_tbl' - это не тот же тип. Если я смогу собрать все увлечения, связанные с одним человеком, тогда используйте это в «Исключении», это решит мою проблему. –

+0

@ DaniFeldman Я не знал, что они разных типов. Но это необычно для вашего дизайна. Я думал, что все увлечения человека должны содержаться внутри таблицы хобби? После импорта в вашу модель они должны иметь один и тот же тип. – Hopeless

+0

@ DaniFeldman, так что 'Person.PersonHobbies_tbl' - это не все увлечения, связанные с человеком? это запутывает здесь. Таким образом, «Лицо» имеет какое-либо навигационное свойство для своих увлечений? Я считаю, что это должно произойти, если вы импортировали свою модель правильно. – Hopeless

Смежные вопросы