【问题标题】:return value based on a string基于字符串的返回值
【发布时间】:2012-07-24 22:20:13
【问题描述】:

您好,我创建了一个类来从客户的帐户表中获取值,我为此创建了一个类。我想通知 AccountId 和我想要返回结果的表的字段(例如 FirstName)。实现这一目标的最佳方法是什么?我得到了类似下面的东西作为我的替代方案,但我无法让它工作......

这就是我想要得到名字结果的方式:

   LabelFirstName.Text = Manage.GetAccount(2, "FirstName"); // where 2 is the id I informed and FirstName is the Column I want to retrieve from the table.

例如,结果将是“John”。

这就是我所拥有的:

public class Manage
{

    public Manage()
    {
    }

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

        var q = (from p in contextLoad.MyAccounts
                 where p.AccountId == AccountId
                 select p).Single();

        string var = q.??    // ?? would be my Field string "FirstName" for example

        return var;
    }

}

请帮忙

谢谢

【问题讨论】:

  • 虽然肯定有一些很棒的答案(Reflection 一个)关于如何实现你想要的我想先问这个:你想要实现什么在这里,因为恐怕我在这里看到了一个很大的反模式,或者至少是一些重新发明轮子。如果您需要名字、地址街道、电话号码和电子邮件,您会怎么做?调用此函数 4 次?
  • 是的,Roblll,我想在网页中填写一份表格,其中包含此帐户、姓名、姓氏、街道等的所有详细信息……所以我想我必须打电话给功能太多次......在这种情况下你会推荐什么?在页面本身中运行 linq 查询是更好的解决方案吗?谢谢。
  • @Gurizao:你的问题解决了吗??
  • @Gurizao 然后返回 q,例如整个“帐户对象”(如demonstrated by SidAhmed),以便您可以在视图中访问它的属性。

标签: c# asp.net string linq return


【解决方案1】:

DataReader 在这种情况下可能很有用:

    var q = from p in contextLoad.MyAccounts 
             where p.AccountId == AccountId 
             select p;


using (var command = dc.GetCommand(q)) 
{ 
    command.Connection.Open(); 
    using (var reader = command.ExecuteReader()) 
    { 
        // expecting one row
        if(reader.Read())
        { 
            return reader.GetString(reader.GetOrdinal(Value)); 
        } 
    } 
    return null;
} 

【讨论】:

    【解决方案2】:

    可以返回类的Object

       public static Object GetAccount(int AccountId)
        {
            LinqSqlDataContext contextLoad = new LinqSqlDataContext();       
            var q = (from p in contextLoad.MyAccounts
                     where p.AccountId == AccountId
                     select p).FirstOrDefault();
    
            return q;
        }
    
    var Account = GetAccount(int AccountId) as Account;
    LabelFirstName.Text = Account.FirstName;
    LabelLastName.Text = Account.LastName;
    

    您可以从对象中获取所有字段!所以任务可以通过一个数据库调用来完成

    【讨论】:

    • 呃...如何使用传入的Field 参数,以便Flav 可以指定要返回的字段值?例如,当Field 包含“电子邮件”时,这将有何帮助?它仍然会返回FirstName,而不是请求的“电子邮件”。
    • 问题的线索是动态传递字段名,而您的建议并不能解决这个问题。
    • @huMptyduMpty 实际上,您编辑了(您的)answer,而不是问题 ;-) 它仍然没有回答 Flav 的问题:如何成为能够指定返回哪个字段/属性的值。无论如何,您显然可以只返回整个对象。
    • @Roblll:我想在网页中填写一份表格,其中包含此帐户、姓名、姓氏、街道等的所有详细信息......所以我想我必须打电话给功能太多次......在这种情况下你会推荐什么?在页面本身中运行 linq 查询是更好的解决方案吗?谢谢
    • @Gurizao:每次通过调用方法来检索数据肯定会减慢您的服务器以及页面加载时间。由于您加载与一个帐户相关的数据,因此加载数据的最佳方法是加载帐户对象并从中获取数据!
    【解决方案3】:

    我建议您返回 Account 对象,然后在您需要的地方检索属性,如下所示:

    public static Account GetAccount(int AccountId)
    {
        LinqSqlDataContext contextLoad = new LinqSqlDataContext();
    
        var q = (from p in contextLoad.MyAccounts
                 where p.AccountId == AccountId
                 select p).Single();
    
        return q;
    }
    
    public void myMethod()
    {
        var account = GetAccout(2);
    
        var accountName = account.FirstName;
        var accountNumber = account.Number;
        // ... and so on
    }
    

    如果这真的没有帮助,您可以使用其他帖子中提到的反射。

    祝你好运。

    【讨论】:

      【解决方案4】:
      string value = (string)q.GetType().GetProperty(Field).GetValue(q, null);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多