如何将 SQL 多表查询转换为 Linq

苏拉杰

我试图将 sql 查询转换为 linq,但无法正确获取。有人可以帮我将下面的转换为 linq 吗?

SELECT stockdiary.datenew, locations.ID AS LOCATIONID, locations.NAME AS LOCATIONNAME, 
                    products.REFERENCE, products.NAME, 
                    products.CATEGORY, categories.NAME AS CATEGORYNAME, 
                    products.SUPPLIER, 
                    SUM(CASE WHEN stockdiary.UNITS <0 THEN stockdiary.UNITS ELSE 0 END) AS UNITSOUT, 
                    SUM(CASE WHEN stockdiary.UNITS <0 THEN stockdiary.UNITS * stockdiary.PRICE ELSE 0 END) AS TOTALOUT, 
                    SUM(CASE WHEN stockdiary.UNITS >=0 THEN stockdiary.UNITS ELSE 0 END) AS UNITSIN, 
                    SUM(CASE WHEN stockdiary.UNITS >=0 THEN stockdiary.UNITS * stockdiary.PRICE ELSE 0 END) AS TOTALIN, 
                    SUM(stockdiary.UNITS) AS UNITSDIFF, 
                    SUM(stockdiary.UNITS * stockdiary.PRICE) AS TOTALDIFF 
                FROM stockdiary JOIN locations ON stockdiary.LOCATION = locations.ID, 
                    products LEFT OUTER JOIN categories ON products.CATEGORY = categories.ID 
                WHERE products.ID = stockdiary.PRODUCT 
                GROUP BY locations.ID, locations.NAME, products.REFERENCE, products.NAME, products.CATEGORY, categories.NAME 
                ORDER BY locations.ID, categories.NAME, products.NAME

====== 下面是我的 linq 查询,它给了我错误的结果。

(from sd in Stockdiaries
join loc in Locations on sd.Location equals loc.Id
join prod in Products on sd.Product equals prod.Id
join cat in Categories on prod.Category equals cat.Id
select new 
{
    Location = loc.Name,
    Category = cat.Name,
    Reference = prod.Reference,
    Product = prod.Name,
    UnitsOut = sd.Units < 0 ? sd.Units:0,
    TotalOut = sd.Units < 0 ? sd.Units * sd.Price:0,
    UnitsIn = sd.Units >= 0 ? sd.Units:0,
    TotalIn = sd.Units >= 0 ? sd.Units * sd.Price:0,
    UnitsDiff = sd.Units,
    TotalDiff = sd.Units * sd.Price

})
普威尔考克斯

您在原始 sql 中有一些旧的连接语法!这是对左连接的补充。这里缩写为:

from        stockdiary 
join        locations on stockdiary.location = locations.id
,           products 
left join   categories on products.category = categories.id 
where       products.id = stockdiary.product 

看看以下方法是否适合您。它可能不会完全按照您的意愿输出,但希望它很接近并且足以让您在此之后使用它。尽管如此,我没有你提供的任何样本数据来测试它,所以我现在唯一可以确认的是它不会出错。

我在描述其组件的代码中有注释。

var query = 
    from sd in Stockdiaries
    join loc in Locations on sd.Location equals loc.Id

    // Your old syntax join should work like an inner join
    join prod in Products on sd.Product equals prod.Id

    // This is a left join.  So you've got to do the 'into' hoop and 
    // then 'overwrite' the cat table.
    join cat in Categories on prod.Category equals cat.Id into pCat
    from cat in pCat.DefaultIfEmpty()

    // put it all together into one result set
    select new {
        Location = loc.Name,
        Category = cat?.Name, // Because it's a left join, it may be null, hence the '?'
        Reference = prod.Reference,
        Product = prod.Name,
        sd.Units,
        sd.Price

    } into cnd

    // group as appropriate, and remember that in linq 
    // grouping is a separate operation from aggregation
    group cnd by new { cnd.Location, cnd.Reference, cnd.Product, cnd.Category } into g

    // aggregate
    select new {
        g.Key.Location,
        g.Key.Reference,
        g.Key.Product,
        g.Key.Category,
        UnitsOut = g.Sum(row => row.Units < 0 ? row.Units : 0),
        TotalOut = g.Sum(row => row.Units < 0 ? row.Units * row.Price : 0),
        UnitsIn = g.Sum(row => row.Units >= 0 ? row.Units : 0),
        TotalIn = g.Sum(row => row.Units >= 0 ? row.Units * row.Price : 0),
        UnitsDiff = g.Sum(row => row.Units),
        TotalDiff = g.Sum(row => row.Units * row.Price)
    };

query.Dump();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

全字匹配查询:将sql转换为linq

来自分类Dev

将Linq表达式转换为SQL Server查询

来自分类Dev

使用sum和group by将sql查询转换为linq

来自分类Dev

如何将此查询从sql转换为linq-to-entities

来自分类Dev

将SQL子查询转换为Linq查询

来自分类Dev

如何从sql查询转换为linq

来自分类Dev

区分将SQL查询转换为Linq(c#)

来自分类Dev

如何将此SQL转换为Linq?

来自分类Dev

将SQL转换为LINQ或改进我的查询

来自分类Dev

将SQL查询转换为LINQ Lambda C#

来自分类Dev

使用LINQ TO SQL将查询转换为对象

来自分类Dev

将SQL查询转换为LINQ /点表示法

来自分类Dev

EF Linq无法将SQL查询转换为正确的linq

来自分类Dev

将SQL查询转换为LINQ#2

来自分类Dev

将linq转换为sql查询,将linq转换为实体

来自分类Dev

将SQL查询转换为LINQ查询

来自分类Dev

将SQL查询转换为LINQ

来自分类Dev

如何将SQL转换为Linq

来自分类Dev

将SQL Server查询转换为Linq查询

来自分类Dev

将SQL查询转换为LINQ语句

来自分类Dev

如何将sql内部联接查询转换为linq转换为sql查询并转换为列表

来自分类Dev

如何将此查询字符串转换为LINQ to SQL查询?

来自分类Dev

如何将sql multimple LEFT JOIN转换为linq

来自分类Dev

将SQL分组查询转换为LINQ查询

来自分类Dev

如何将SQL查询转换为LinQ

来自分类Dev

如何将sql限制查询转换为linq lambda?

来自分类Dev

如何将Sql内部查询转换为Linq以获得列的总和

来自分类Dev

如何将此 SQL 查询转换为 LINQ

来自分类Dev

如何将 sql 查询转换为 linq LEFT OUTER JOIN