如何在 if 范围之外阅读查询变量并进一步使用它。
If (IsPaymentList)
{
var query = paymentList.GroupBy(
grp => (grp.GrouByField),
(GrouByField, paymentListgroup) => new
{
Key = GrouByField,
receiptAmount = paymentListgroup.Sum(fields => fields.PaymentAmount),
creditAccountnumber = paymentListgroup.Max(fields => fields.CreditAccountNumber),
bankAccountName = paymentListgroup.Max(fields => fields.AccountName),
bankName = paymentListgroup.Max(fields => fields.BankName),
payCurrency = paymentListgroup.Max(fields => fields.PaymentCurrencyID),
partnerServiceID = paymentListgroup.Max(fields => fields.PartnerServiceID),
});
}
请有人分享您的经验。 感谢
答案 0 :(得分:1)
您需要做的是将查询变量移出if语句的上下文。
这是一个关于如何使用整数列表执行此操作的示例:
var list = new [] { 10, 3, 2, 4, 6, 7, 8 };
var condition = false;
IEnumerable<IGrouping<int,int>> query;
if(condition)
{
query = list.GroupBy(x => x);
}
然后我可以继续在if语句之后查询query
变量,如果我喜欢的话:
query.Take(2)
问题在于你想在你创建它的范围之外使用query
变量。
请考虑以下事项:
static void Main(string[] args)
{
var x = 10;
{
var y = 20;
}
Console.WriteLine(x+y);
}
这不会编译,因为y
在x
以外的另一个范围内,您可以通过将y
的删除移到该范围之外来解决此问题。像这样:
var x = 10;
int y;
{
y = 20;
}
Console.WriteLine(x+y);
在这种情况下声明var
时不能使用y
因为这意味着你也告诉编译器它是什么类型的。你不是。所以写var y;
没有任何意义,但var y = 10;
会这样做,因为现在编译器知道这实际上是一个整数。
答案 1 :(得分:0)
您可以声明查询变量的类型
IQueryable<IGrouping<typeOfKey,typeOfSelect>> query = null;
在if之外并将其设置为null,其中typeOfKey是grp.GrouByField属性的类型。您必须创建一个具有所需属性的新类,而不是选择匿名类型:
public class NewClass
{
public int Key {get;set;}
public decimal ReceiptAmount {get;set;}
//add all the properties here
public NewClass(string key,decimal recieptAmount)
{
//and add constructor for all the needed properties
}
}
创建类后,将查询设置为泛型类型
//i used int for your grp.GrouByField type
IQueryable<IGrouping<int,NewClass>> query = null;
if(IsPaymentList)
{
query = paymentList.GroupBy(
grp => (grp.GrouByField),
(GrouByField, paymentListgroup) =>
new NewClass(GrouByField,
paymentListgroup.Sum(fields => fields.PaymentAmount),
paymentListgroup.Max(fields => fields.CreditAccountNumber),
paymentListgroup.Max(fields => fields.AccountName),
paymentListgroup.Max(fields => fields.BankName),
paymentListgroup.Max(fields => fields.PaymentCurrencyID),
paymentListgroup.Max(fields => fields.PartnerServiceID)));
}