1

我有以下代码。所有 20 个对象似乎都可以正常创建。
然后第一个foreach工作正常并遍历所有 20个。
使用的第二个示例linq也工作得很好。

那么是否可以使用诸如 之类的属性仅针对其中一个对象ReportKey,并仅为该对象运行该方法RunThisReport?或者,因为我使用了这种类型IEnumerable<>,我走入了死胡同?

static void Main(string[] args) {

    var models = SelectReports("SELECT * FROM 20RecordTable");

     //1.running the method for each
    foreach(myReport x in models) {
        Console.WriteLine("Doubled key:{0}",  x.myReportKeyDoubled().ToString());
    }

    //2.linq sample
    var result = from sample in models
                    select sample.ReportName;
    foreach(string x in result) {
        Console.WriteLine(Convert.ToString(x));
    }

    //3. target a single report say reportKey 512 and run the method RunThisReport?

    Console.WriteLine("Press [enter] to exit");
    Console.Read();
}

static IEnumerable<myReport> SelectReports(string myCommandText) {

    var connectionString = ConfigurationManager.ConnectionStrings["xxx"].ConnectionString;
    using(var conn = new SqlConnection(connectionString))
    using(var cmd = conn.CreateCommand()) {
        conn.Open();
        cmd.CommandText = myCommandText;
        using(var reader = cmd.ExecuteReader()) {

            while(reader.Read()) {
                yield return new myReport {

                    ReportKey = reader.GetInt32(reader.GetOrdinal("ReportKey")),
                    ReportName  = reader.GetString(reader.GetOrdinal("ReportName")),
                    ReportDescription  = reader.GetString(reader.GetOrdinal("ReportDescription")),
                    ReportTechDescription = reader.GetString(reader.GetOrdinal("ReportTechDescription "))

                };
            }
        }
    }
}

public class myReport {

    public int ReportKey { get; set; }
    public string ReportName { get; set; }
    public string ReportDescription { get; set; }
    public string ReportTechDescription { get; set; }

    public int myReportKeyDoubled() {
        return ReportKey*2;
    }
    public string RunThisReport(){
        return this.ReportName + " needs to be run via" + this.ReportTechDescription;
    }         
}
4

3 回答 3

2
 var report = models.SingleOrDefault(m => m.ReportKey == 512);

 if (report != null)
     report.RunThisReport();

或者使用理解语法(丑陋,是吗?):

var report = (from m in models
              where m.ReportKey == 512
              select m).SingleOrDefault();

顺便说一句,使用Dapper您的代码将如下所示:

static IEnumerable<myReport> SelectReports(string myCommandText) 
{    
    var connectionString = ConfigurationManager.ConnectionStrings["xxx"].ConnectionString;
    using(var conn = new SqlConnection(connectionString))
    {
        conn.Open();
        return conn.Query<myReport>(myCommandText);    
    }
}

Dapper 可通过 NuGet 获得。这是我在使用 ADO.NET 时的选择

于 2012-11-16T23:26:00.840 回答
1
models.First(x => x.ReportKey == 42).RunThisReport();
于 2012-11-16T23:26:57.323 回答
1

如果我没看错,那么您正在为使用 LINQ 获取对象而苦苦挣扎。这里最简单的做法是使用 LINQ 扩展方法。我相信这就是您正在寻找的:

models.First(i => i.ReportKey == yourReportKey).RunThisReport();

或者澄清这里发生了什么:

// Get the report that matches the key
myReport report = models.First(i => i.ReportKey == "YOUR-KEY-VALUE");

// Call RunThisReport for that report.
report.RunThisReport();

这也适用于集合:

models.Where(i => i.ReportKey == yourReportKey).ForEach(report => report.RunThisReport());

希望有帮助!如果没有,请澄清您的问题,我很乐意提供帮助。

于 2012-11-16T23:34:14.463 回答