【问题标题】:Return result of primary table queried then append result of join to a property返回查询的主表结果,然后将连接结果附加到属性
【发布时间】:2016-09-19 18:20:09
【问题描述】:

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

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

【问题讨论】:

  • 这是最终查询吗,即您是否需要它保持 IQueryable 以供进一步处理?
  • 目前,我没有任何限制。
  • 可能我不清楚。目前您的var projectsIQueryable&lt;Project 类型。将其更改为 IEnumerable&lt;Project&gt; 是否适合您?
  • 这似乎是 LINQ to Entities(即应该标记为 entity-framework,而不是 linq-to-sql)?

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


【解决方案1】:

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

唯一可能的方法是结合第二种方法来对数据库执行 LINQ to Entities 查询,并切换到 LINQ to Objects 上下文并像这样进行“修复”和最终投影:

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&lt;Project&gt;。当然你可以用AsQueryable方法把它转回IQueryable&lt;Project&gt;,但它不再是一个真正的数据库查询,所以如果你应用额外的过滤器、排序、分页等,它们都将发生在内存中(仅query 部分将针对数据库执行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多