【问题标题】:Reverse result of a partition from a list using Entity Framework and ASP.NET MVC使用 Entity Framework 和 ASP.NET MVC 从列表中反转分区结果
【发布时间】:2015-09-18 11:46:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# asp.net-mvc entity-framework controller datalistitem


    【解决方案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 
    

    【讨论】:

      【解决方案2】:

      您可以使用Except 将一个人的爱好排除在所有爱好之外:

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

      我认为使用ExceptContains 性能更好,因为有一些内部HashSet 用于实现异常操作。

      【讨论】:

      • 这似乎是最好的解决方案,但你的代码不好,因为Hobbies_tblPersonHobbies_tbl 不是同一类型。如果我能够收集与一个人相关的所有爱好,那么在Except 中使用它会解决我的问题。
      • @DaniFeldman 我不知道它们属于不同类型。但是你的设计很奇怪。我认为一个人的所有爱好都应该包含在爱好表中?导入模型后,它们应该具有相同的类型。
      • @DaniFeldman 所以Person.PersonHobbies_tbl 不都是与人相关的爱好吗?这里很混乱。那么Person 是否有任何导航属性来满足其爱好?如果您正确导入模型,我相信它应该有。
      • 这只是我真正问题的一个例子。我有更多的表与包含连接表的 id 的表(PersonHobbies_tbl)连接在一起。所以PersonHobbies_tbl 包含 ids(id 也是爱好),Hobbies_tbl 包含与爱好相关的数据(例如name)。
      • @DaniFeldman 那么你是如何真正获得一个人的相关爱好的呢? (我以为你只需要这个Person.PersonHobbies_tbl)。当然,如果你知道你可以在Except 中传递它,就像我的回答一样。目前我没有太多关于可以帮助你的人的信息。
      猜你喜欢
      • 1970-01-01
      • 2017-07-21
      • 2011-11-14
      • 2016-01-01
      • 2010-12-08
      • 2020-11-25
      • 1970-01-01
      • 2023-03-25
      • 2015-06-10
      相关资源
      最近更新 更多