返回查询主表的结果,然后将连接结果附加到属性

时间:2016-09-19 18:20:09

标签: c# .net linq linq-to-entities

我试图告诉.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

我这样做的原因是我有一个没有外键的数据库,我正在尝试模拟导航属性。 (我不能改变模型)

1 个答案:

答案 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部分将针对数据库执行)。