选择2列2表

时间:2018-03-30 05:13:50

标签: c# linq

我有两张桌子:

员工 :( ID ,NAME)

薪水 :( ID ,VALUE)

我的问题是:

  1. 我怎么能写" 查询语法"和" 方法语法"在Controller中返回View(),如SQL Query中所示:

    select a.NAME, b.VALUE from Staff a, Salary b where a.ID = b.ID

  2. 我如何在视图中声明:

    @model IEnumberable<Project.Model.xxxx>

  3. 这是我使用1个表格的方式

    [ Controller:IndexController ]

    LinQDataContext data = new LinQDataContext();
    
    public ActionResult Index(int id)
    {
      var staffWithTheirSalary = data.Staff.Select(a => a).Where(a => a.ID == id);
    }
    

    [查看:索引]

    @model IEnumerable<Project.Model.Staff>
    
    @foreach(var item in Model)
    {
      @item.Name
    }
    

3 个答案:

答案 0 :(得分:1)

由于正在加入表格,我更喜欢使用SELECT ID, x.A FROM mytable CROSS APPLY ( SELECT TOP 1 t.A FROM (VALUES (A1), (A2), (A3), (A4)) AS t(A) GROUP BY t.A ORDER BY COUNT(*) DESC) AS x 。控制器将使用LinQDataContext来获取数据,但在创建C#对象时,我建议创建一个仅用于显示数据的类(在示例中称为query syntax)。

MySalaryModel

答案 1 :(得分:1)

使用ViewModel, 您可以在项目中创建Viewmodel文件夹,并像这样创建类。

 public class StaffSalaryViewModel
    {
     public int StaffId { get; set; }
     public int SalaryeId { get; set; }
     public string StaffName { get; set; }
     public string SlaaryName { get; set; }

    }

行动中:

public ActionResult Index(int id)
{
  StaffSalaryViewModel staffWithTheirSalary = (from itemStaff in data.Staff join     itemSalary in data.Salary in itemStaff.id equal itemSalary.id where itemSalary.id=id select new StaffSalaryViewModel {Salaryname=itemSalary.Name,StaffName=itemStaff.Name,SalaryId=itemSalary.Id,itemStaff.Id}).ToList();
}

在视图

@model IEnumerable<Project.ViewModel.StaffSalaryViewModel>

@foreach(var item in Model)
{
  @item.SalaryName
}

答案 2 :(得分:1)

您可以将视图模型设为IEnumerable<StaffSalaryViewModel>,其中StaffSalaryViewModel为:

public class StaffSalaryViewModel
{
    public int StaffId { get; set; }
    public string Name { get; set; }
    public decimal Salary { get; set; } // Not sure of the type
}

然后提取清单:

使用Linq方法语法:

var result = data.Staff
   .Join(data.Salary,
      staff => staff.ID,
      salary => salary.ID,
      (staff, salary) => new StaffSalaryViewModel { 
         StaffId = staff.ID, 
         Name = staff.NAME, 
         Salary = salary.VALUE 
      });

使用Linq查询语法:

var result = from staff in data.Staff 
         join salary in data.Salary on staff.ID equals salary.ID
         select new StaffSalaryViewModel { 
            StaffId = staff.ID, 
            Name = staff.NAME, 
            Salary = salary.VALUE 
         };

<强>更新

看起来VALUE表中的Salary字段允许空值。如果是这样,只需使视图模型中的相应属性可以为空,如此(假设它是decimal类型):

public class StaffSalaryViewModel
{
    public int StaffId { get; set; }
    public string Name { get; set; }
    public decimal? Salary { get; set; } // Nullable/optional decimal
}

或者,如果您要将StaffSalaryViewModel.Salary设置为0如果VALUE为空,请将您的查询更改为:

 Salary = salary.VALUE ?? 0
相关问题