asp.net MVC - LINQ To SQL、C#、MVC 4,在模型帮助程序中加入时遇到问题

本文关键字:MVC 模型 帮助程序 问题 遇到 LINQ net To SQL asp | 更新日期: 2023-09-27 17:55:55

我对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>

由于加入。

经过一些研究,我已经研究了"mine"变量被发送到什么,以及这是否应该是一个列表<>或 IENumerable<>等等。 我可悲地迷失了。

仅供参考,这就是我想在控制器中使用"GetMyRuns"做的事情:

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

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

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

谢谢。

asp.net MVC - LINQ To SQL、C#、MVC 4,在模型帮助程序中加入时遇到问题

正如错误所示,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生产代码中的变量? ;)

我相信

违规的行就在这里。

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; }
}

希望这能让它更清楚一点