带有 WHERE 子句的 SQL INNER JOIN 到 LINQ 格式

Posted

技术标签:

【中文标题】带有 WHERE 子句的 SQL INNER JOIN 到 LINQ 格式【英文标题】:SQL INNER JOIN with WHERE clause to LINQ format 【发布时间】:2012-02-02 23:21:43 【问题描述】:

如何将此 sql 查询转换为 LINQ?

SELECT company.ticker, company.primary_analyst, 
       personnel.last_name, company.research_associate,
       company.secondary_associate, company.coverage_status
FROM company 
     INNER JOIN personnel ON company.primary_analyst = personnel.dpinitials
WHERE personnel.last_name='marley' AND company.associate='ml'
ORDER BY company.coverage_status

【问题讨论】:

见 Converting SQL to LINQ, Part 6: Joins (Bill Horst) 不幸的是它是 VB ......好吧 【参考方案1】:
   var list = (from u in db.Users
                       join c in db.Customers on u.CustomerId equals c.CustomerId
                       where u.Username == username
                       select new u.UserId, u.CustomerId, u.ClientId, u.RoleId, u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active,c.ProfilePic).First();

【讨论】:

您想通过一些解释来扩充您的纯代码答案吗?这将减少 *** 是免费代码编写服务的误解。【参考方案2】:

@BrokenGlass 的解决方案非常好。 但是,如果您有 1..many 关系,则很少需要在 LINQ 中使用连接运算符。在这个例子中,如果 company->personell 是 1..many,我会这样写查询:

var results = from c in company
              where c.associate == "ml"
              from p in c.personnel
              where p.last_name == "marley"
              orderby c.coverage_status asc
              select new
              
                  c.ticker, 
                  c.primary_analyst, 
                  p.last_name, 
                  c.research_associate,  
                  c.secondary_associate, 
                  c.coverage_status
              ;

这也可以使用表达式链语法来编写:

var results = company.Where(c => c.associate == "ml")
                     .SelectMany(c => c.personnel, (c, p) => new
                     
                         c.ticker, 
                         c.primary_analyst, 
                         p.last_name,  
                         c.research_associate,  
                         c.secondary_associate, 
                         c.coverage_status
                     )
                     .Where(x => x.last_name == "marley")
                     .OrderBy(x => x.coverage_status)

【讨论】:

【参考方案3】:

很相似:

var results = from c in company
              join p in personnel on c.primary_analyst equals p.dpinitals
              where p.last_name == 'marley' and c.associate == 'ml'
              orderby c.coverage_status asc
              select new 
              
                c.ticker, c.primary_analyst, p.last_name, c.research_associate,  
                c.secondary_associate, c.coverage_status
              ;

以上项目到一个具有您想要的属性的匿名类 - 如果您的模型中有一个等效的 POCO 类,您应该项目到那个,如果不是在很多情况下您可能应该创建一个。

【讨论】:

我正在使用 LINQPad。有没有办法将我的查询作为“C# 表达式”?

以上是关于带有 WHERE 子句的 SQL INNER JOIN 到 LINQ 格式的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 查询的 WHERE 子句中引用或 INNER JOIN 一个 Pandas 数据帧值 [重复]

带有两个不同 where 子句的内/左连接

带有 INNER JOIN 和 WHERE 的 SQL 查询

INNER JOIN 之前的 WHERE 子句

带有 WHERE 子句的 SQL COUNT

INNER JOIN Where 子句 [重复]