如何访问查询变量

时间:2011-07-08 07:26:01

标签: c# .net visual-studio linq

如何在 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),

            });
}

请有人分享您的经验。 感谢

2 个答案:

答案 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);
}

这不会编译,因为yx以外的另一个范围内,您可以通过将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)));
}