【问题标题】:Joining to Lists via LINQ通过 LINQ 加入列表
【发布时间】:2016-09-01 20:18:42
【问题描述】:

我有两个对象列表

任务

    public string ProjectNumber { get; set; }
    public string Name { get; set; }
    public string ProjectManager { get; set; }
    public string Customer { get; set; }

项目

    public string Number { get; set; }
    public string Title { get; set; }
    public string Manager { get; set; }
    public string Customer { get; set; }

示例数据

任务

Projectnumber | Name          | ProjectManager | Customer 
    7780      | Buy container | NULL           | NULL
    7781      | Block budget  | NULL           | NULL

项目

Nubmer        | Title         | Manager        | Customer 
    7780      | Surface       | Bill Gates     | Microsoft 
    7781      | iWatch        | Tim Cook       | Apple

我想得到一个List<Task> 作为结果:

Projectnumber | Name          | ProjectManager | Customer 
    7780      | Buy container | Bill Gates     | Microsoft 
    7781      | Block budget  | Tim Cook       | Apple

到目前为止我尝试了什么:

List<Task> spTasks = SPRepo.GetAllTasksByResourceTeam();
List<Project> projects = PWARepo.GetAllProjects();

    List<Task> joinedSPTasks = from a in spTasks
                        join b in projects on a.ProjectNumber equals b.Number
                        select new Task() {
                        a.Projectnumber = a.Projectnumber,
                        a.Name = a.Name,
                        a.ProjectManager = b.ProjectManager,
                        a.Customer = b.Manager
                        };

为什么我不能为属性赋值?我在 Visual Studio 中收到以下错误:

Error: Invalid anonymous type member decorator. Anonymous type members must be declared with a member assignment simple name or member access.

注意:这些对象列表来自不同的来源。无法将它们加入源系统(例如通过表连接的数据库)!

【问题讨论】:

标签: c# linq


【解决方案1】:

目前尚不清楚您是要更新当前任务还是创建新任务。

新建一个会是这样的

var joinedSPTasks = from a in spTasks
                    join b in projects on a.ProjectNumber equals b.Number
                    select new Task(){
                        Projectnumber = a.Projectnumber,
                        Name = a.Name,
                        ProjectManager = b.ProjectManager,
                        Customer = b.Manager
                        };

【讨论】:

  • 错误 CS0266 无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)
  • 已修复。将返回类型更改为var
  • 已将其更改为 IEnumerable&lt;Data.Task&gt; - 不了解如何从 IEnumerable&lt;T&gt; 获取 List&lt;T&gt; 的人不应通过将其更改为 var 来修复错误
  • var 在从上下文中明确返回类型时非常干净和常见。
  • 我明白你的意思。我可以添加关于 LINQ 返回类型的解释。
【解决方案2】:
List<Task> joinedSPTasks = from a in spTasks
                    join b in projects on a.ProjectNumber equals b.Number
                    select new Task(){
                        ProjectNumber = a.Projectnumber,
                        Name = a.Name,
                        ProjectManager = b.ProjectManager,
                        Customer = b.Manager
                        };

var joinedSPTasks = from a in spTasks
                    join b in projects on a.ProjectNumber equals b.Number
                    select new {
                        ProjectNumber = a.Projectnumber,
                        Name = a.Name,
                        ProjectManager = b.ProjectManager,
                        Customer = b.Manager
                        };

删除“a”。从匿名成员名称开始。第二种选择是使用匿名类型。你需要使用var关键字来声明匿名类型

【讨论】:

  • 错误 CS0266 无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)
【解决方案3】:

您正在选择动态对象中的值。而不是使用 select new{,而是使用 select new Task{

        List<Task> joinedSPTasks = (from a in spTasks
                join b in projects on a.ProjectNumber equals b.Number
                select new Task{
                    Projectnumber = a.Projectnumber,
                    Name = a.Name,
                    ProjectManager = b.ProjectManager,
                    Customer = b.Manager
                    }).ToList();

【讨论】:

  • 错误 CS0266 无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)
  • 您可能想在最后放置一个 .ToList() 。 (从 a 在 spTasks 中加入 b 在 a.ProjectNumber 上的项目中等于 b.Number 选择新任务{ a.Projectnumber = a.Projectnumber, a.Name = a.Name, a.ProjectManager = b.ProjectManager, a.Customer = b .Manager }).ToList()
  • 当我删除一个。从 Projectnumber = a.Projectnumer 之类的属性中......它现在可以工作了。请更新答案,我会将其标记为已接受的答案。
【解决方案4】:

你创建的匿名类型是错误的——应该是这样的:

                joinedSPTasks = from a in spTasks
                join b in projects on a.ProjectNumber equals b.Number
                select new {
                    Projectnumber = a.Projectnumber,
                    Name = a.Name,
                    ProjectManager = b.ProjectManager,
                    Customer = b.Manager
                    };

您实际上可以删除参数命名并像这样编写它:

select new { a.Projectnumber, a.Name, b.ProjectManager, b.Manager };

【讨论】:

  • 错误 CS0266 无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多