c# - LINQ 查询婴儿步骤

标签 c# linq

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

在我标记的地方,我想编写一个查询(我假设使用 LINQ)提取 CompanyName where 主键 == 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; }

}

}

最佳答案

添加使用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,但如果 key 3028 不在前 100 名内,这会给您带来麻烦。

您应该做的是使用 Entity Framework(或类似工具)创建模型,然后编写针对由它生成的类的查询。好消息是 LINQ 查询将完全相同 - 它只是在幕后转换为 SQL。

关于c# - LINQ 查询婴儿步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13255398/

相关文章:

c# - 为什么 Replace() 字符串方法不修改我的字符串变量?

c# - 用于验证列表是升序还是降序的 Linq 表达式

c# - linq where list 包含 any in list

c# - 是否可以使用 dart 将 linq lambda 表达式转换为 SQL?

c# - LINQ 按错误结果分组

c# - LINQ 的复杂 SQL 子查询

c# - 我应该从另一个应用服务调用应用服务吗?

c# - 从 JSON 对象获取键值

c# - 如何将 CSS 引用链接添加到文件夹中的本地 HTML 文件?

c# - 我可以将 List<object> 用作方法中的形式参数吗?