4

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

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

我怀疑这是微不足道的,但我是新手LINQ,我在MSDNLINQ上查找了一些基本信息,似乎无法让它工作。

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

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

您应该做的是使用实体框架(或类似工具)创建一个模型,然后编写一个针对由它生成的类的查询。好消息是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 回答