c# - 如何将 sql 表中的多列分配给 List<> 中的单列

标签 c# mysql angularjs linq

我的 sql 中有 3 个表:-

Table1(ClassNote)、Table2(ClassSamplePaper)、Table3(ClassEbook) 的 PK 分别为 ClassNoteID、ClassSamplePaperID 和 ClassEbookID。

现在我遇到了一种情况,我将它们的值传递到从我的 c# Controller 到 Angular Controller 的单独列表。

我的 C# 代码是:-

switch (dbundle.MaterialIndicator)
                            {
                                case 1:
                                    List<ClassEbook> EBookList = null;
                                    EBookList = (from cl in db.ClsObj
                                                 join csr in db.ClassSubRelationObj on cl.ClassesID equals csr.ClassSubjectFK
                                                 join csmr in db.ClassSubMatRelationObj on csr.ClassSubjectFK equals csmr.SubjectFK
                                                 join eb in db.CebookObj on csmr.ClassEbookFK equals eb.ClassEbookID
                                                 where cl.ClassesID == dbundle.ClassesFK && csr.ClassSubjectFK == dbundle.ClassSubjectFK
                                                 select eb).ToList();
                                    return new JsonResult { Data = EBookList, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
                                case 2:
                                    List<ClassNote> NoteList = null;
                                    NoteList = (from cl in db.ClsObj
                                                join csr in db.ClassSubRelationObj on cl.ClassesID equals csr.ClassSubjectFK
                                                join csmr in db.ClassSubMatRelationObj on csr.ClassSubjectFK equals csmr.SubjectFK
                                                join cn in db.CNoteObj on csmr.ClassNoteFK equals cn.ClassNoteID
                                                where cl.ClassesID == dbundle.ClassesFK && csr.ClassSubjectFK == dbundle.ClassSubjectFK
                                                select cn).ToList();

                                    return new JsonResult { Data = NoteList, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
                                case 3:
                                    List<ClassSamplePaper> SPList = null;
                                    SPList = (from cl in db.ClsObj
                                              join csr in db.ClassSubRelationObj on cl.ClassesID equals csr.ClassSubjectFK
                                              join csmr in db.ClassSubMatRelationObj on csr.ClassSubjectFK equals csmr.SubjectFK
                                              join sp in db.CSPObj on csmr.ClassEbookFK equals sp.ClassSamplePaperID
                                              where cl.ClassesID == dbundle.ClassesFK && csr.ClassSubjectFK == dbundle.ClassSubjectFK
                                              select sp).ToList();
                                    return new JsonResult { Data = SPList, JsonRequestBehavior = JsonRequestBehavior.AllowGet };

我在我的 Angular Controller 中获取列表:-

ClassFactory.AvailableListData($scope.MaterialTblID).then(function (d) {
            $scope.AvailableList = d.data;
            if ($scope.AvailableList != null && $scope.AvailableList.length != 0) {
                    $scope.AvailableListTextToShow = "";
                }
                else {
                    $scope.AvailableListTextToShow = "No Data Available";
                }
        }, function (error) {
            alert('Cannot Load AvailableList Data');
        })

代码运行良好!但我想对不同表中的 ID 使用单个字段。我怎样才能实现这个目标?

Razor 语法:-

 <tr ng-repeat="L in AvailableList">
                            <td>
                                {{$index+1}}
                            </td>
                            <td>
                                {{L.Heading}}
                            </td>
                            <td>
                                {{L.ID}} //I want to use it here
                            </td>
                        </tr>

抱歉,如果我没有把问题说清楚。欢迎对此发表评论。

最佳答案

我建议创建一个ViewModel用于显示目的,它将是一个普通的类,只有HeadingID属性(加上您想要渲染的任何其他内容)。在 Controller 中,您必须从数据库模型映射到 ViewModel,或者使用 AutoMapper 之类的东西并返回这个新的“ViewModel”,而不是 SPListNoteList电子书列表

一个例子是:

public class MyViewModel
{
    public string Heading { get;set; }
    public int ID { get; set; }
}

public static class MyViewModelsExtensions
{
    public static IQueryable<ListViewModel> ToEbookViewModels(this IQueryable<ClassEbook> classEBooks)
    {
        return classEBooks.Select(m => new ListViewModel { Heading = m.Heading, ID = m.ClassEbookID });
    }

    // TDOD: Add other ToViewModels methods to handle tranforming ClassNote and ClassSamplePaper models
}

// Inside controller action/where your current switch statement is
switch (dbundle.MaterialIndicator)
{
         case 1:
                var EBookList = (from cl in db.ClsObj......);
                List<ListViewModel> viewModelEbook = EBookList.ToEbookViewModels().Distinct().ToList();
                return new JsonResult { Data = viewModelEbook, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        case 2:
        case 3:
            // both of these will look similar to the above case handling except you will pass in IQueryable of ClassNote and ClassSamplePaper
}

我没有在 Angular 中做过任何工作,但假设您当前使用 JsonResultData 属性来工作,那么您不必更改任何内容..

有关拥有单独的域/数据模型和 View 模型的主题和优点的一些进一步阅读可以找到 here模式三here 。是的,该示例引用了 Razor,但原理是相同的。

关于c# - 如何将 sql 表中的多列分配给 List<> 中的单列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48484655/

相关文章:

javascript - 使用 ng-repeat 时在 Angular 中创建行

sql - MySQL 中是否有类似 IN 但使用 AND 而不是 OR 的东西?

mysql - Hive 按播放次数查找前 n 个页面

mysql - 学习管理的数据库设计

c# - 在 ASP.NET 中从数据库中获取一行数据的最有效方法

javascript - 2 路数据绑定(bind)到 contenteditable span

javascript - 从 AngularJS 网络应用程序发送电子邮件

c# - 是否可以将扩展方法添加到类属性以获取与该属性关联的属性的值?

c# - .NET Core 从项目中排除一个类

c# - 如何在 C# 中将类型为 `object` 的变量转换为具有泛型类型的类?