使用 Entity Framework 和 ASP.NET MVC 从列表中反转分区结果
Reverse result of a partition from a list using Entity Framework and ASP.NET MVC
假设我有三个表(Person_tbl、PersonHobbies_tbl 和 Hobbies_tbl) 它们之间的关系如下:
Person_tbl [1]-------[n] PersonHobbies_tbl [n]-------[1] Hobbies_tbl
逻辑是特定的人可以有更多的爱好。我想检索未分配给由其 ID 表示的特定人的爱好列表。
例如,如果我想获得分配给特定人的爱好列表,我可以这样做:
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();
我想以有效的方式获得与此相反的东西(包含其他爱好的列表)。
所以我的问题是如何以足够有效的方式解决我的问题?
一个快速的 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
可以用Except
从所有爱好中排除一个人的爱好:
var obj = db.Hobbies_tbl.Except(Person.PersonHobbies_tbl);
我认为使用 Except
比 Contains
性能更好,因为有一些内部 HashSet 用于实现异常操作。
假设我有三个表(Person_tbl、PersonHobbies_tbl 和 Hobbies_tbl) 它们之间的关系如下:
Person_tbl [1]-------[n] PersonHobbies_tbl [n]-------[1] Hobbies_tbl
逻辑是特定的人可以有更多的爱好。我想检索未分配给由其 ID 表示的特定人的爱好列表。
例如,如果我想获得分配给特定人的爱好列表,我可以这样做:
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();
我想以有效的方式获得与此相反的东西(包含其他爱好的列表)。
所以我的问题是如何以足够有效的方式解决我的问题?
一个快速的 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
可以用Except
从所有爱好中排除一个人的爱好:
var obj = db.Hobbies_tbl.Except(Person.PersonHobbies_tbl);
我认为使用 Except
比 Contains
性能更好,因为有一些内部 HashSet 用于实现异常操作。