简体   繁体   English

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

[英]convert two LINQ queries to single query

I have made two LINQ queries one for getting Id and another for getting amount from the same model class.我已经进行了两个 LINQ 查询,一个用于获取Id ,另一个用于从同一个 model class 获取amount Since I am new to LINQ I don't know whether these two queries can be combined and get the same result.由于我是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);

Both the above queries give the same row only selected fields are different.上述两个查询都给出了相同的行,只有选定的字段不同。 So is there any way I can use one single query to retrieve both the values and then how to convert KaryakramId to int and NikashaAmount to decimal ?那么有什么方法可以使用一个查询来检索这两个值,然后如何将KaryakramId转换为int并将NikashaAmount转换为decimal

You can use projection and assign it on anonymous type:您可以使用投影并将其分配给匿名类型:

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

Then from there you can access it via properties of your anonymous type:然后从那里您可以通过匿名类型的属性访问它:

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

The required data can be accessed with FirstOrDefault() extension and assign to anonymous type as:可以使用FirstOrDefault()扩展访问所需的数据,并将其分配给匿名类型:

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

From the result , required values can be accessed from anonymous type:result中,可以从匿名类型访问所需的值:

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

You could do something like this, assuming that your values are returned as strings and will be valid when converted to their types, and that the nikasha object is not too big that returning the whole thing adversely affects performance:你可以做这样的事情,假设你的值作为字符串返回并且在转换为它们的类型时有效,并且 nikasha object 不是太大,返回整个东西会对性能产生不利影响:

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;

You can use select new object with some property that you want您可以将 select new object 与您想要的一些属性一起使用

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM