LINQ查询婴儿步骤

时间:2012-11-06 16:34:42

标签: c# linq

我有以下代码。它运行良好。

在我标记的地方,我想写一个查询(我假设LINQ),提取CompanyName where MainKey == 3028

我怀疑这是微不足道的,但我是LINQ的新手,我在MSDN上查找了一些基本的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; }

}

}

3 个答案:

答案 0 :(得分: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

但是有一件事你必须记住 - 这里你没有使用LINQ查询到SQL服务器 - 而是你在内存中检索所有数据,然后在.NET中过滤它们。这意味着如果数据库包含数百万行,它们将全部从SQL服务器中提取。您正在应用TOP 100,但如果密钥3028不在前100个内,那将使您遇到麻烦。

您应该做的是使用Entity Framework(或类似工具)创建模型,然后编写一个针对其生成的类的查询。但好处是 LINQ查询将完全相同 - 它将在幕后被翻译为SQL。

答案 1 :(得分:4)

linq查询将是。

var result = from rec in ModelOfWHData.vw_DimCasinos
where (rec.MainKey == 3028)
select rec.CompanyName

答案 2 :(得分: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查询。