将两个LINQ查询转换为单个查询

问题描述

我进行了两个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转换为int,如何将NikashaAmount转换为decimal

解决方法

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

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);
,

您可以执行以下操作,假设您的值以字符串形式返回,并且在转换为它们的类型时将是有效的,并且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);
}
,


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;

,

您可以使用具有所需属性的选择新对象

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

可以使用扩展名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);