我的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
类,而不是使用Account
through(它需要.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命名约定,但这不会影响它是否工作。