LINQ多表关联,List列表显示

本文介绍了一个基于MVC架构的项目实现案例,详细讲解了NewsController类如何通过继承AdminBaseController基类来处理新闻列表请求,并展示了如何利用TempData传递类型ID、使用ViewData设置页面大小等操作。

 此功能是在项目中分离出来的。这种架构可能不太适合别人所用,请甚用

1、NewsController.cs(控制类)

 public class NewsController : AdminBaseController<NewsInfo,News>
    {
        public ActionResult List(int typeID)
        {
            //类似于Session传址
            TempData["TypeID"] = typeID;
            //ViewData只能在当前Action中有效   
            ViewData["PageSize"] = SysConfig.PageSize;
            return View();
        }

        protected override System.Collections.IEnumerable GetPagedList(News type, int? page, int rows)
        {
            int typeID = (int)TempData["TypeID"];
            return type.GetNews(typeID, page ?? 1, rows);
        }

}

2、AdminBaseController.cs(基类)

 public class AdminBaseController<TInfo, TData> : Controller
        where TInfo : BaseModel, new()
        where TData : BaseData<TInfo>, new()
    {

[HttpPost]
        public void GetList(int? page, int rows)
        {
            TData type = new TData();
            IEnumerable pagedList = GetPagedList(type, page, rows);
            int total = type.Count(null);
            Response.Write(Value.Common.JsonHelper.ToDataGridJson(pagedList, total));
        }

        protected virtual IEnumerable GetPagedList(TData type, int? page, int rows)
        {
            return type.GetPagedList(page ?? 1, x => x.ID, false, rows);
        }

}

3、Business类中(只针对于当前页面的处理类)

 public class News : BaseData<NewsInfo>
    {
        public IEnumerable GetNews(int typeID, int page, int rows)
        {
            var v = from t in Table
                    join tt in this.GetTable<NewsTypeInfo>()
                    on t.TypeID equals tt.ID
                    where tt.ID == typeID
                    select new { t.ID, t.Title, TypeName = tt.Name };

            return v.Skip((page - 1) * rows).Take(rows).ToList();
        }
    }

 

4、Models类(实体类)

NewsInfo.cs

[Table(Name = "dbo.News")]
    public class NewsInfo : BaseModel
    {

public string TypeName{ get; set; }

}

5、页面(View)

 

### C# 中使用 LINQ 进行联结查询 在 C#LINQ 查询中,`join` 子句用于实现个集合之间的关联操作。这种功能类似于 SQL 中的 `JOIN` 操作,允许开发者通过指定键来匹配不同数据源中的记录并生成新的结果集[^3]。 下面是一个完整的示例,展示如何利用 LINQ 执行联结查询: #### 示例代码 假设我们有两个列表分别示学生和课程成绩的数据结构如下: ```csharp class Student { public int Id { get; set; } public string Name { get; set; } } class Grade { public int StudentId { get; set; } public string Subject { get; set; } public double Score { get; set; } } ``` 以下是具体的 LINQ 联结查询代码: ```csharp using System; using System.Collections.Generic; using System.Linq; public class Program { public static void Main() { List<Student> students = new List<Student> { new Student { Id = 1, Name = "Alice" }, new Student { Id = 2, Name = "Bob" }, new Student { Id = 3, Name = "Charlie" } }; List<Grade> grades = new List<Grade> { new Grade { StudentId = 1, Subject = "Math", Score = 90 }, new Grade { StudentId = 1, Subject = "English", Score = 85 }, new Grade { StudentId = 2, Subject = "Math", Score = 75 }, new Grade { StudentId = 3, Subject = "English", Score = 88 } }; // 使用 join 关键字进行联结查询 var queryResult = from student in students join grade in grades on student.Id equals grade.StudentId select new { StudentName = student.Name, Subject = grade.Subject, Score = grade.Score }; foreach (var item in queryResult) { Console.WriteLine($"Student: {item.StudentName}, Subject: {item.Subject}, Score: {item.Score}"); } } } ``` 此代码片段展示了如何将两个不同的集合(students 和 grades)基于共同的关键字段(student.Id 和 grade.StudentId)进行联结,并生成一个新的匿名对象集合,其中包含了学生的姓名、科目以及分数信息。 如果需要更复杂的联结条件或者处理左外连接等情况,则可以通过引入额外的方法调用来完成。例如,在某些情况下可能需要用到 `GroupJoin` 方法来模拟 SQL 中的 LEFT JOIN 行为。 #### 左外连接示例 对于左外连接的情况,可以采用以下方式实现: ```csharp var leftOuterJoinQuery = from student in students join grade in grades on student.Id equals grade.StudentId into gj from subgrade in gj.DefaultIfEmpty() select new { StudentName = student.Name, Subject = subgrade?.Subject ?? "No Grades", Score = subgrade?.Score ?? 0.0 }; ``` 在此例子中,当某个学生没有任何对应的评分记录时,默认会显示 `"No Grades"` 及零分作为占位符。 --- ### 总结 以上介绍了基本的 LINQ 联结查询及其扩展形式——左外连接的操作方法。这些技术能够帮助开发人员高效地处理来自不同数据源的信息,并将其整合到单一的结果集中以便进一步分析或呈现给最终用户[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值