c# - Linq Left join, where, group by, count()

标签 c# sql linq

我需要有关在 linq 语句中执行左连接的帮助。我的 T-sql 查询按预期工作,但我似乎无法从 Linq 获得想要的结果。我也意识到有很多像我这样的问题,但我似乎无法将任何解决方案应用于我的案例。

产品表

+---+------------+-----------+
|   |transportID |  Type(int)|
+---+------------+-----------+
| 1 | 5          | 1         |
| 2 | 5          | 3         |
| 3 | 6          | 3         |
+---+------------+-----------+

商店

+---+------------+-------------+
|   |Name        |Type1(string)|
+---+------------+-------------+
| 1 | Ho         | 1           |
| 2 | He         | 2           |
| 3 | Be         | 3           |
| 4 | Ke         | 4           |
| 5 | Fe         | 5           |
+---+------------+-------------+

我想要的结果是

+---+------------+-------------+
|   |Type        |Count        |
+---+------------+-------------+
| 1 | 1          | 1           |
| 2 | 2          | 0           |
| 3 | 3          | 1           |
| 4 | 4          | 0           |
| 5 | 5          | 0           |
+---+------------+-------------+

按预期工作的我的 tsql

SELECT 
    Type1,
    Count(Pro.transportId) as Count

FROM dbo.stores as sto

left Join dbo.products as pro on (sto.Type1 = pro.Type AND pro.transportId=5)

Where Type1 is not null
  group by Type1
  ORDER BY Type1 * 1 ASC

我的 Linq 尝试返回了这个。

+---+------------+-------------+
|   |Type        |Count        |
+---+------------+-------------+
| 1 | 1          | 1           |
| 3 | 3          | 1           |
+---+------------+-------------+

Linq 语句。

var res =   (from sto in _context.Stores
                             join pro in _context.Products on sto.Type1 equals System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)pro.Type).Trim()
                             where pro.transportId == transportId
                             group pro by pro.Type1 into pt1
                             select new TypeTransportation()
                             {
                                 Type = pt1.Key, // Needs to be int
                                 Count = pt1.Count()
                             }).ToList();

我试过做一些 defaultifempty 但似乎无法让它工作。

最佳答案

这是 MSDN 链接“如何:使用 LINQ 执行左外连接”:https://msdn.microsoft.com/en-gb/library/bb397895.aspx

你的代码应该是这样的:

        var res = (from sto in _context.Stores
               join pro in _context.Products on sto.Type1 equals System.Data.Objects.SqlClient.SqlFunctions.StringConvert((double)pro.Type).Trim() into grpJoin
               from product in grpJoin.DefaultIfEmpty()
               where product.transportId == transportId
               group product by product.Type1 into pt1
               select new TypeTransportation()
               {
                   Type = pt1.Key, // Needs to be int
                   Count = pt1.Count()
               }).ToList();

关于c# - Linq Left join, where, group by, count(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35863755/

相关文章:

C# 泛型 - 返回派生类的对象?

php - MySQL仅在两个表中不存在时插入

linq - LINQ OrderBy不订购..什么都没有改变..为什么?

c# - WebForms 将 CheckboxList 值传递给 List<T>

c# - 对 Enumerable 调用 .ToArray 会破坏 Enumerable

c# - EF : Cannot insert NULL to column

c# - 如何在 Visual C# 中从 Active Directory 填充 gridview

c# - ASP.NET默认登录,获取用户ID session 值

sql - 在数据周期内有条件地增加字段值 - 有没有一种仅使用 SQL 的方法?

sql - 在 Oracle SQL 中比较具有不同顺序的字符串的两列