【问题标题】:convert two LINQ queries to single query将两个 LINQ 查询转换为单个查询
【发布时间】:2020-12-10 02:29:36
【问题描述】:

我进行了两个 LINQ 查询,一个用于获取 Id,另一个用于从同一模型类获取 amount。由于我是LINQ 的新手,所以不知道这两个查询是否可以合并得到相同的结果。

var KID = db.Nikashas.Where(n => n.NIKASHAId == id).Select(n => n.KaryakramId).FirstOrDefault();
var KAMT = db.Nikashas.Where(n => n.NIKASHAId == id).Select(n => n.NikashaAmount).FirstOrDefault();
int kid = Convert.ToInt32(KID);
decimal kamt = Convert.ToDecimal(KAMT);

上述两个查询都给出了相同的行,只是选定的字段不同。那么有什么方法可以使用一个查询来检索这两个值,然后如何将KaryakramId 转换为intNikashaAmount 转换为decimal

【问题讨论】:

  • 为什么不将数据库中的 id 和数量保存为整数和十进制值?将数据保存到数据库时,不应将数据转换为另一种类型,例如字符串。

标签: c# asp.net-mvc entity-framework linq asp.net-mvc-4


【解决方案1】:

您可以使用投影并将其分配给匿名类型:

var KID = db.Nikashas.Where(n => n.NIKASHAId == id).Select(n => new { karya = n.KaryakramId, nika = n.NikashaAmount }).FirstOrDefault();

然后您可以从那里通过匿名类型的属性访问它:

int kid = Convert.ToInt32(KID.karya);
decimal kamt = Convert.ToDecimal(KID.nika);

【讨论】:

【解决方案2】:

可以使用FirstOrDefault() 扩展名访问所需的数据,并将其分配给匿名类型:

var result = db.Nikashas
              .FirstOrDefault()(n => n.NIKASHAId == id)
              .Select(n => new 
               { 
                  kId = n.KaryakramId,
                  kAmt = n.NikashaAmount 
               });

result,可以从匿名类型访问所需的值:

int kid = Convert.ToInt32(result.kId);
decimal kamt = Convert.ToDecimal(result.kAmt);

【讨论】:

    【解决方案3】:

    您可以这样做,假设您的值作为字符串返回并且在转换为它们的类型时有效,并且 nikasha 对象不会太大以至于返回整个事物会对性能产生不利影响:

    var nikasha = db.Nikashas.Where(n => n.NIKASHAId == id).FirstOrDefault();
    
    //to handle a default null, check for null
    if(nikasha != null)
    {
        int KID = int.Parse(nikasha.KaryakramId);
        decimal KAMT = decimal.Parse(nikasha.NikashaAmount);
    }
    

    【讨论】:

    【解决方案4】:

    您可以使用带有某些您想要的属性的选择新对象

    var result = db.Nikashas.Where(n => n.NIKASHAId == id).Select(n => new { n.KaryakramId, n.NikashaAmount}).FirstOrDefault();
    

    【讨论】:

      【解决方案5】:
      
      
      var res = db.Nikashas.Where(n => n.NIKASHAId == id)
          .Select(n => new { 
              kid = Convert.ToInt32(n.KaryakramId),  
              kamt = Convert.ToDecimal(n.NikashaAmount)}).FirstOrDefault();
      
      int kid = res.kid;
      decimal kamt = res.kamt;
      
      

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • 链接不是答案,是另一个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多