2014-02-14 83 views
1

我有一个对象定义为这样:ICollection的<>包含在EF作为HashSet的失败

public class QuestionSetAssignee 
{ 
    [Required] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<QuestionSet> QuestionSets { get; set; } 

    public override int GetHashCode() 
    { 
     return Id.GetHashCode(); 
    } 

    public override bool Equals(Object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 

     QuestionSetAssignee qsa = obj as QuestionSetAssignee; 

     return Id == qsa.Id; 
    } 
} 

以下语句:

QuestionSetAssignees.Contains(director) 

public bool isEditable() 
{ 
    ApplicationDbContext db = new ApplicationDbContext(); 
    QuestionSetAssignee director = db.QuestionSetAssignees.Find((int)QuestionSetAssigneeEnum.Director); 

    if (Conference.AcceptingDirectorApplications && QuestionSetAssignees.Contains(director)) 
    { 
     return false; 
    } 

    return true; 
} 

返回false,据我所知,应该返回真实。 (注:Conference.AcceptingDirectorApplications返回true)

如果它不立即清除,导演对象和HashSet的对象来通过为DynamicProxies(由于EF和对象层次)。

这里是指挥目标:

enter image description here
(点击查看大图)

这里是QuestionSetAssignees对象:

enter image description here
(点击查看大图)

我无法控制QuestionSetAsignees的类型,因为它是由EF 6提供的(它在模型中声明为ICollection。这也意味着我无法提供一个比较对象(就我所知,据我所知)。我想要做的就是能够比较两个QuestionSetAsignee对象。我也尝试过实现IEquatable,但那不起作用。

+0

你可以显示导致“QuestionSetAssignees.Contains(director)'调用的代码吗? –

+0

@ScottChamberlain更新 –

回答

1

问题是,它是在一个SQL调用把你Contains()所以无论你放什么EqualsGetHashCode()都不会有问题,因为要连接到数据库不使用它们进行测试平等(这就是为什么当在整理不区分大小写的数据库上使用实体框架时,"This" == "this"将返回true)。

的“快速和肮脏”的方式来解决它是实现在内存中的集合,然后做.Contains

QuestionSetAssignees.AsEnumerable().Contains(director)) 

但是,这不会给你带来非常不错的表现。您可能需要以不同的方式来处理此查询,以便SQL像您所希望的那样工作。

我认为以下方法可行,但请测试一下,如果没有,我会将其删除。

QuestionSetAssignees.Select(assignee => assignee.Id).Contains(director.Id) 
+0

QuestionSetAssignees对象没有方法Select()。它也没有AsEnumerable()。 –

+0

这是QuestionSetAsignees的属性声明: public virtual ICollection QuestionSetAssignees {get;组; } –

+1

一定要在文件的顶部包含'using System.Linq;',这就是为什么你不能'.Select('也不'''''''''' –

相关问题