我有以下代码。它运行良好。
在我标记的地方,我想写一个查询(我假设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; }
}
}
答案 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查询。