4

次のコードがあります。それはうまくいきます。

マークした場所LINQCompanyName whereMainKey == 3028

これは些細なことだと思いますが、私は初めてで、 MSDNで基本的な情報をLINQ調べましたが、うまくいかないようです。LINQ

namespace EntityFrameworkExperiment {
class Program {

    static void Main(string[] args) {
        var models = SelectTop100Models("SELECT top 100 * FROM WH.dbo.vw_DimXXX");
        Console.Write("hello world");

        //<<<<<<<linq query to pull out companyname when MainKey == 3028

        Console.Read();
    }

    static IEnumerable<MyModel> SelectTop100Models(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 MyModel {

                        MainKey = reader.GetInt32(reader.GetOrdinal("MainKey")),
                        ServerId  = reader.GetInt32(reader.GetOrdinal("ServerId")),
                        CompanyId = reader.GetInt32(reader.GetOrdinal("CompanyId")),
                        CompanyName = reader.GetString(reader.GetOrdinal("CompanyName")),


                    };
                }
            }
        }
    }
}

public class MyModel {

    public int MainKey { get; set; }
    public int ServerId { get; set; }
    public int CompanyId { get; set; }
    public string CompanyName { get; set; }

}

}
4

3 に答える 3

7

追加using System.Linq

クエリは

var companyName = models
  .Where(o => o.MainKey == 3028) // apply the filter
  .Select(o => o.CompanyName)    // tell it you only need the one property
  .FirstOrDefault();             // take the first result it finds or use 'null' if the MainKey does not exist

ただし、覚えておく必要があることが 1 つあります。ここでは、SQL サーバーに対して LINQ クエリを使用していません。代わりに、メモリ内のすべてのデータを取得し、.NET でフィルター処理しています。これが意味することは、データベースに数百万の行が含まれている場合、それらはすべて SQL サーバーからプルされるということです。TOP 100 を適用していますが、キー 3028 が最初の 100 内にない場合、問題が発生します。

すべきことは、Entity Framework (または同様のツール) を使用してモデルを作成し、それによって生成されたクラスを対象とするクエリを作成することです。良いことは、LINQ クエリがまったく同じであることです。バックグラウンドで SQL に変換されるだけです。

于 2012-11-06T16:37:31.737 に答える
4

linq クエリは次のようになります。

var result = from rec in ModelOfWHData.vw_DimCasinos
where (rec.MainKey == 3028)
select rec.CompanyName
于 2012-11-06T16:37:16.543 に答える
1

以下の LINQ クエリは、T-SQL クエリから生成している IEnumerable を後処理し、一致する単一のオブジェクトを返すか、見つからない場合は null を返します。

MyModel result = (from m in MyModel
                  where m.MainKey == 3028
                  select m).SingleOrDefault();

string companyName = result.CompanyName;

ただし、LINQ-to-SQL を使用し、実際に LINQ で T-SQL クエリを生成して実行する方がよいと思います。

于 2012-11-06T16:41:14.473 に答える