等效于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
};