等效于SQL的实体框架为空

等效于SQL的实体框架为空,sql,entity-framework,linq-to-entities,Sql,Entity Framework,Linq To Entities,我正在尝试将以下查询转换为实体框架: SELECT Subjects.Name FROM Subjects LEFT OUTER JOIN Projects_Subjects ON Subjects.ID = Projects_Subjects.Section_ID WHERE (Projects_Subjects.Project_ID IS NULL) OR

我正在尝试将以下查询转换为实体框架:

SELECT            Subjects.Name
FROM              Subjects LEFT OUTER JOIN
                        Projects_Subjects ON Subjects.ID = Projects_Subjects.Section_ID
WHERE             (Projects_Subjects.Project_ID IS NULL) OR
                        (Projects_Subjects.Project_ID <> 2)
就语法而言,编译器对此很满意,但在运行时,我遇到以下错误:

'System.Data.Objects.DataClasses.EntityCollection`1'. Only primitive types (such as Int32, String, and Guid) and entity types are supported.

真的没有其他信息。据我所知,它不喜欢s.Projects==null位,因为如果我去掉它,它工作得很好。问题是:如何对实体集合执行该检查?

答案是我是个白痴。LINQtoEntity查询的默认值是,它将返回所有内容,您只需从中减去。这么简单

db.Subjects.Where(s => !s.Projects.Select(p => p.ID).Contains(ProjectID))

实际上做了我想让它做的事。。。很抱歉浪费了您的时间。

您没有检查列是否为null,而是检查关联属性和其他实体是否为null。正如您所指出的,这是默认状态

您得到的异常基本上意味着只有POCO类型可以发送到SQL,以便在where/order by语句中与SQL类型进行比较。EF认为您正在尝试比较这里的对象,所以抱怨。

类似的事情

var subjects = from subject in dc.GetTable<Subjects>()
                               join entityProjects_Subjects in dc.GetTable<Projects_Subjects>()
                                    on subject.ID equals entityProjects_Subjects.Section_ID into tempProjects_Subjects
                               from projects_subjects in tempProjects_Subjects.DefaultIfEmpty()
                               where projects_subjects.Project_ID != 2 || projects_subjects == null
                               select new
                               {                                   
                                   Name = subject.Name
                               };

听起来空值和实体框架有很多问题:没关系,我是个白痴。不需要检查null,因为这是默认状态。。。如果没有s.Projects==null位,查询工作正常。
var subjects = from subject in dc.GetTable<Subjects>()
                               join entityProjects_Subjects in dc.GetTable<Projects_Subjects>()
                                    on subject.ID equals entityProjects_Subjects.Section_ID into tempProjects_Subjects
                               from projects_subjects in tempProjects_Subjects.DefaultIfEmpty()
                               where projects_subjects.Project_ID != 2 || projects_subjects == null
                               select new
                               {                                   
                                   Name = subject.Name
                               };