2

如何在以下课程中返回 FirstName 和 Surname?

public static string GetAccount(int AccountId)
{        
    LinqSqlDataContext contextLoad = new LinqSqlDataContext();

    var q = (from p in contextLoad.MyAccounts
             where p.AccountId == AccountId
             select new { Name = p.FirstName, Surname = p.Surname }).Single();

    return ??;
} 
4

7 回答 7

6

您可以返回强类型类、动态对象或元组。我更喜欢返回一个强类型的类。

使用该dynamic类型的问题是您不会仅在运行时获得智能感知和异常。

元组的问题在于它不会向您显示返回的内容。您或其他开发人员必须阅读该方法才能知道什么是名字和什么是姓氏。

样本

public class MyResult
{
    public string Name { get; set; }
    public string Surname { get; set; }
}

public static MyResult GetAccount(int AccountId)
{        
    LinqSqlDataContext contextLoad = new LinqSqlDataContext();

    var q = (from p in contextLoad.MyAccounts
             where p.AccountId == AccountId
             select new MyResult{ Name = p.FirstName, Surname = p.Surname }).Single();

    return q;
} 

更新

我建议使用SingleOrDefault而不是Single. null如果帐户不存在而不是抛出异常,这将确保您获得结果。

//
select new MyResult{ Name = p.FirstName, Surname = p.Surname }).SingleOrDefault();
//
于 2012-07-26T11:44:07.073 回答
4

如果您不想为返回类型定义新对象,可以使用Tuple<string, string>.

于 2012-07-26T11:43:53.217 回答
1

另一个(不是最好的:))选项是返回一个数组:

public static string[] GetAccount(int AccountId)
{        
    LinqSqlDataContext contextLoad = new LinqSqlDataContext();

    var q = (from p in contextLoad.MyAccounts
             where p.AccountId == AccountId
             select new { Name = p.FirstName, Surname = p.Surname }).Single();

    return new []{q.Name, q.Surname};
} 
于 2012-07-26T11:52:22.070 回答
1

通过引用传入两个对象,您可以设置它们。

更改为使其成为 try 函数,作为代码气味较少的版本的示例

public static bool TryGetAccount(int AccountId, out String FirstName, out String Surname)
{        
    LinqSqlDataContext contextLoad = new LinqSqlDataContext();

    var q = (from p in contextLoad.MyAccounts
             where p.AccountId == AccountId
             select new { Name = p.FirstName, Surname = p.Surname }).SingleOrDefault();


    FirstName=(q==null) ? null: q.Name;
    Surname=(q==null) ? null: q.Surname;
    return q!=null;
} 

现在你可以做

string firstName;
string surname;

if (TryGetAccount(id, out firstName,out surname)) {
  // firstName now equals the first name and surname now equals the surname
} else {
  // Deal with value not found

}

于 2012-07-26T11:51:02.247 回答
0

如果您使用的是 .Net 4,则可以返回动态而不是字符串,并直接从返回的对象中获取这两个值。

于 2012-07-26T11:44:22.513 回答
0

您可以使用 Hashtable 来避免创建新的结果类。像这样的东西:

  public static Hashtable GetAccount(int AccountId)
    {        
       LinqSqlDataContext contextLoad = new LinqSqlDataContext();

         var q = (from p in contextLoad.MyAccounts
         where p.AccountId == AccountId
         select new { Name = p.FirstName, Surname = p.Surname }).Single();

        return new Hashtable(q.FirstName, q.Surname);
    } 

比您可以通过您的名字作为键获得姓氏。

于 2012-07-26T13:40:48.577 回答
0

只要您不介意以这种方式使用返回的类型,将其作为元组返回怎么样 tuple.Item1 , tuple.Item2

于 2012-07-26T11:50:44.937 回答