我试图告诉.NET创建一个新对象,从第一个数据集获取属性并将连接的结果附加到新创建的对象的一个属性
var projects = from p in projectSet //projectSet is DbSet<Project>....
join lmp in LMProjects on p.ProjectID equals lmp.lmp_ProjectID
where p.UserID == value
select new Project { LMProject = lmp };
这是一个问题,我可以告诉它创建一个新对象,将连接的结果(lmp
)分配给它的一个属性,但是如何告诉它使用{{1的结果启动新创建的对象的所有其他值?如果没有手动分配值,这甚至是可能的(p
类中有大约30个......)
我想过这样做,但这并不是我想要的。
Project
我这样做的原因是我有一个没有外键的数据库,我正在尝试模拟导航属性。 (我不能改变模型)
答案 0 :(得分:0)
即使您想手动列出select
子句中的所有字段,也不能直接执行此操作,因为实体框架不允许投影到实体类型。
唯一可行的方法是将第二种方法结合起来,再次执行LINQ to Entities查询数据库,切换到LINQ to Objects上下文并执行&#34; fixup&#34;最终投影如下:
var query = from p in projectSet
join lmp in LMProjects on p.ProjectID equals lmp.lmp_ProjectID
where p.UserID == value
select new { Project = p, LMProject = lmp };
var projects = query.AsEnumerable().Select(r =>
{
r.Project.LMProject = r.LMProject;
return r.Project;
};
但请注意,这会将projects
的上下文和类型更改为IEnumerable<Project>
。当然,您可以使用IQueryable<Project>
方法将其转回AsQueryable
,但它不再是真正的数据库查询,因此如果您应用其他过滤器,排序,分页等,它们将会发生在内存中(只有query
部分将针对数据库执行)。