我的gui正在调用一个服务项目,该项目执行一些linq工作,并将数据返回给我的gui。但是,我正在与方法的返回类型进行斗争。经过一番阅读,我将此作为我的方法:

public static IEnumerable GetDetailedAccounts()
 {
 IEnumerable accounts =(from a in Db.accounts
                        join i in Db.financial_institution on
                            a.financial_institution.financial_institution_id
                               equals i.financial_institution_id
                        join acct in Db.z_account_type on a.z_account_type.account_type_id
                               equals acct.account_type_id
                        orderby i.name
                        select new
                             {
                              account_id = a.account_id,
                              name = i.name,
                              description = acct.description
                              });
            return accounts;
}

不过,打电话的人有点吵。我想我是搞砸了回电的类型,或者没能很好地处理来电者,但这并不像我所希望的那样起作用。
这就是我试图从我的gui调用方法的方式。
IEnumerable accounts = Data.AccountService.GetDetailedAccounts();

Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Accounts:");
Console.ForegroundColor = ConsoleColor.White;

foreach (var acc in accounts)
  {
   Console.WriteLine(string.Format("{0:00} {1}", acc.account_id, acc.name + " " + acc.description));
  }

int accountid = WaitForKey();

但是,我的前臂和ACC-不起作用。acc不知道我在方法中设置的名称、描述和id。我至少接近正确了吗?

最佳答案

@brokenglass是正确的,问题的根源在于您使用的是匿名类型。这将导致您使用不知道对象类型的IEnumerable的非泛型版本。
我建议创建一个实际的dynamic类,而不是使用Accountthrough(它需要.net 4.0,这对您来说可能是问题,也可能不是问题)。
这样你就可以返回一个IEnumerable<Account>而不仅仅是IEnumerable。然后您就可以使用这些属性,因为它知道它是一个帐户。
创建account类之后,您的方法将变成:

public static IEnumerable<Account> GetDetailedAccounts()
{
    IEnumerable<Account> accounts = (from a in Db.accounts
                    join i in Db.financial_institution on a.financial_institution.financial_institution_id
                        equals i.financial_institution_id
                    join acct in Db.z_account_type on a.z_account_type.account_type_id equals
                        acct.account_type_id
                    orderby i.name
                    select new Account {account_id = a.account_id, name = i.name, description = acct.description});
    return accounts;

}

然后调用代码可以保持不变。
我想我应该指出var并不像你想象的那样工作。变量的类型仍然由编译时决定,这意味着(在大多数情况下)它只是一个快捷方式。您的示例将与使用object而不是var的示例相同,因为IEnumerable只能包含object
如果您在.NET中工作,我建议您遵循.NET命名约定,但这不会影响它是否工作。

10-08 07:40
查看更多