0

假设我有三个表(Person_tblPersonH​​obbies_tblHobbies_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();

我想以一种有效的方式获得与此相反的内容(包含其他爱好的列表)。

所以我的问题是如何以足够有效的方式解决我的问题?

4

2 回答 2

1

您可以使用Except从所有爱好中排除一个人的爱好:

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

我认为 usingExceptContains因为有一些内部 HashSet 用于实现异常操作具有更好的性能。

于 2015-09-18T12:31:33.330 回答
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 
于 2015-09-18T12:15:54.233 回答