【问题标题】:How to join two tables and fetch data from如何连接两个表并从中获取数据
【发布时间】:2021-08-10 01:29:52
【问题描述】:

我有两个表,我想从中获取数据并将其返回给 API 以供使用。两个表之间是有关系的。

[![在此处输入图片描述][1]][1]

当我尝试获取数据时,它只返回一行,这不是我想要的。

如何返回与ResellerId 相关的所有数据(8435 个示例)?

这是我的代码:

    public RateSheetModel GetRateSheet(int resellerId)
    {
        // This only returns only one row.
        // How can I get all rows for all the same Id?
        var rateSheetDetails = (from r in _Context.WholesaleRateSheet 
                                where r.ResellerId == resellerId 
                                select r).First();
    }   

模型

public class WholesaleRateSheetMarkup
{
    [Key]
    public int RateSheetMarkupId { get; set; }
    [Required]
    public int ResellerId { get; set; }
    [StringLength(50)]
    public string RatesheetName { get; set; }

} 

public class WholesaleRateSheet
{
    [Key]
    public int RateSheetId { get; set; }
    [Required]
    public int RateSheetMarkupId { get; set; }
    [Required]
    public int ResellerId { get; set; }
    public string CountryCode { get; set; }
    public string Description { get; set; }
    public decimal Peak { get; set; }
    public bool IsSouthAfricanRate { get; set; }
    public bool IsInertnationRate { get; set; }
    public bool IsSpecificRate { get; set; }
    public int DestinationGroupSetId { get; set; }
    public int DestinationGroupId { get; set; }
    public string DestinationLookup { get; set; }
    public DateTime CreatedDate { get; set; }
    public string CreatedByUsername { get; set; }
    public DateTime LastUpdatedDate { get; set; }
    public string UpdatedByUsername { get; set; }

}  

【问题讨论】:

  • 为什么在指定 First() 时期望不止一行?
  • 哦不!让我现在改一下
  • 我现在已将其更改为 (.ToList()) 并且我从一张表中获取了我想要的所有数据。如何连接两个表并仍然使用 where 子句?
  • 这能回答你的问题吗? Join/Where with LINQ and Lambda
  • 这就是 Include 的用途

标签: c# entity-framework join


【解决方案1】:
    var rateSheetDetails = (from r in _Context.WholesaleRateSheet 
                            join rateSheet in _Context.<tableName> on r.ResellerId equals rateSheet.ResellerId
                            where r.ResellerId == resellerId 
                            select new { foo });

您这样做是在创建一个新类型,作为两个表中数据的组合。您可以定义一个模型类并使用类似的东西

select new MyClass {
  Foo = r.RateSheetMarkupId,
  Bar = rateSheet.RateSheetName
}

否则,不需要类定义。简单地使用不带类的“新”将创建一个匿名类型,其属性与您选择的内容相匹配。如果您共享实体名称,此处的示例可能会更精确。

总而言之,关闭你的代码:

    public List<RateSheetModel> GetRateSheet(int resellerId)
    {
        var rateSheetDetails = (from r in _Context.WholesaleRateSheet
                                join m in _Context.RateSheetMarkup on r.ResellerId equals m.ResellerId
                                where r.ResellerId == resellerId 
                                select new RateSheetModel  {
                                    ResellerId = r.ResellerId
                                    RatesheetName = m.RatesheetName
                                };
        return rateSheetDetails.ToList<RateSheetModel>;


    }
    
public RateSheetModel  { //dunno what this model looks like, but example
   public int ResellerId {get; set;}
   public string RatesheetName {get; set;}
}

【讨论】:

  • 你能把它放在一个方法中,这样我也可以看到将保存数据的返回类型吗?
  • 如果您可以共享与您共享的表以及您要返回的字段相对应的两个实体名称,我可以更好地了解您正在寻找的内容
  • 我已经添加了我想要返回的模型。我只想返回所有内容,然后从前端过滤数据
  • 不太清楚 RatesheetModel 的预期,但这个编辑应该让你更接近
  • 函数不必返回模型,我只是放了那个模型。这是将使用数据的 API。您可以就我如何做到这一点提出更好的建议 public IActionResult GetRateSheet(int resellerId) { return Ok(rateSheetService.GetRateSheet(resellerId)); }
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多