1

次のコードがあります。20 個のオブジェクトすべてが正常に作成されたようです。
最初 の例は問題なく動作 foreachし、20 個すべてを繰り返し処理します。
linq

のようなプロパティを使用して、オブジェクトの 1 つだけをターゲットにし、そのオブジェクトだけに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 に答える