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

convert two LINQ queries to single query

我创建了两个 LINQ 查询,一个用于获取 Id,另一个用于从同一模型 class 获取 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

你可以这样做,假设你的值作为字符串返回,并且在转换为它们的类型时有效,并且 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 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);


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;

您可以将 select 新对象与您想要的 属性 一起使用

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