2

我对 LINQ to SQL 很陌生,直到最近还没有遇到任何问题。用 C# 编写。

我有一个模型助手 .cs 文件。我正在尝试创建一个公共列表,我可以从中查看。

这是模型助手中的代码(删除了无关的、工作的、内容:

using System;
using System.Collections.Generic;
using System.Linq;

namespace sample_runs.Models {
    partial public class SampleRunsDataContext {
        public List<attendee> GetMyRuns(int me) {          
            var mine = (from a in attendees
                       join s in sample_runs 
                            on a.sample_run_id equals s.sample_run_id
                       where a.user_id == me
                       orderby a.sample_run_id descending
                       select new {
                           s.sample_run_id,
                           a.role.role_name,
                           s.sample_run_status.sample_run_status_name,
                           s.project_number,
                           s.run_type.run_type_name,
                           s.description
                       }).ToList();
            return mine;
        }

    }

}

至于数据库,像这样考虑涉及的两个表。sample_runs 就像派对或活动的列表。因此,对于每一行,我们都获得了派对的所有信息。然后,我们有一个名为参加者的表格,其中所有聚会参加者都被单独列出。每行都有关于与会者的信息,包括他们的“角色”,我认为这就是隐喻失效的地方。每个聚会可以有任意数量的参加者。该数据库非常漂亮,带有外键和您通常的各种规范化。

对于给定的与会者,我想要的只是一份他们参加过的所有聚会的清单。我希望这是有道理的。

我在这个文件中的所有其他 linq 语句和列表都工作正常。这让我感到悲伤:

Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>'
to 'System.C9ollections.Generic.List<sample_runs.Models.attendee>

我很困惑这是否应该是一个公共列表或其他东西。

我不确定是否

List<attendee>

真的应该

List<attendee>

由于加入。

经过一番研究,我玩弄了“我的”变量被发送到的地方,以及这应该是 List<> 还是 IENumerable<> 等等等等。我可悲地迷路了。

仅供参考,这就是我想在控制器中对“GetMyRuns”执行的操作:

    public ActionResult myruns() {
        return View(db.GetMyRuns(someintvar));
    }

然后我想我将构建一个强类型视图并从那里开始。

我知道这可能是一个垒球问题,但我非常感谢您能为我提供的任何帮助。

谢谢你。

4

2 回答 2

3

如错误所示,mine是一个匿名对象列表,而您应该返回一个attendee对象列表。在select您的查询中创建匿名对象(注意没有任何类型指示):

select new /* NO TYPE */ {
    s.sample_run_id,
    ...
}

您的问题的解决方案将取决于您的应用程序的结构,但解决它的一种方法是创建某种 DTO(数据传输对象)列表并将其返回:

public List<AttendeeDto> GetMyRuns(int me)
{
    var mine = (from a in attendees
                join s in sample_runs 
                on a.sample_run_id equals s.sample_run_id
                where a.user_id == me
                orderby a.sample_run_id descending
                select new AttendeeDto
                {
                    SampleRunId = s.sample_run_id,
                    RoleName = a.role.role_name,
                    SampleRunStatusName = s.sample_run_status.sample_run_status_name,
                    ProjectNumber = s.project_number,
                    RunTypeName = s.run_type.run_type_name,
                    Description = s.description
                }).ToList();

        return mine;
    }
}

您的AttendeeDto课程将如下所示:

class AttendeeDto
{
    public int SampleRunId { get; set; }
    public string RoleName { get; set; }
    public string SampleRunStatusName { get; set; }
    public int ProjectNumber { get; set; }
    public string RunTypeName { get; set; }
    public string Description { get; set; }
}

顺便说一句 - 我希望你永远不会在生产代码中真正命名整数变量me和列表变量?mine;)

于 2013-01-24T16:45:11.003 回答
2

我相信违规的路线就在这里。

select new {
    s.sample_run_id,
    a.role.role_name,
    s.sample_run_status.sample_run_status_name,
    s.project_number,
    s.run_type.run_type_name,
    s.description
 }

您正在选择一种新的匿名类型。相反,您不应该创建一个参加者类型的新对象,然后映射属性吗?

select new Attendee {
    SampleRunId = s.sample_run_id,
    Description = s.description
 }

请注意,这确实需要您有参加者课程。

public class Attendee 
{
    public int SampleRunId { get; set; }
    public string Description { get; set; }
}

希望这使它更清楚一点

于 2013-01-24T16:48:05.990 回答