2016-09-19 85 views
0

我试图告诉.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),以它的一个属性,但我怎么告诉它使用的结果p的结果是否启动新创建对象的所有其他值?这甚至可能没有手动分配值(Project类中有大约30个...)

我想过这样做,但那不是我正在寻找的。

var projects = 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 }; 

我这样做的原因是我有一个没有外键的数据库,我试图模拟导航属性。 (我无法更改模型)

+0

这是最后一个查询,即你需要它来保持IQueryable进一步处理吗? –

+0

目前,我没有任何制约。 –

+0

也许我不清楚。目前你的'var projects'的类型是'IQueryable '为你工作吗? –

回答

0

即使您想手动列出select子句中的所有字段,也不能直接执行该操作,因为实体框架不允许投影到实体类型。

唯一可能的途径是你的第二个执行LINQ到实体查询方法结合了切换到LINQ agains数据库对象方面,做了“修正”,并最终投射这样的:

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>。当然,您可以使用AsQueryable方法将它重新设置为IQueryable<Project>,但它不再是真正的数据库查询,因此如果您应用其他过滤器,排序,分页等,它们将全部发生在内存中(只有query部分将会针对数据库执行)。

相关问题