Linq to sql C LINQ相当于一个稍微复杂的SQL查询

Linq to sql C LINQ相当于一个稍微复杂的SQL查询,linq-to-sql,Linq To Sql,因此,我有一个SQL查询,如下所示 SELECT P.Date, P.CategoryName, P.ProductName, SUM(Quantity) Quantity, SUM(Sales) TotalSales, IsLevelThree FROM Products P LEFT JOIN LevelThreeTracking LTT ON P.Date = LTT.Date AND P.CategoryName = P.CategoryName AND P.SecurityID

因此,我有一个SQL查询,如下所示

SELECT P.Date, P.CategoryName, P.ProductName, SUM(Quantity) Quantity, SUM(Sales) TotalSales, IsLevelThree
FROM Products P LEFT JOIN LevelThreeTracking LTT
    ON P.Date = LTT.Date AND P.CategoryName = P.CategoryName AND P.SecurityID = LTT.SecurityID
WHERE P.Date = '12-31-2007' AND P.CategoryName= 'CategoryName'
GROUP BY P.Date, P.CategoryName, P.ProductName, LTT.IsLevelThree
HAVING SUM(Quantity) <> 0
ORDER BY P.ProductName

有什么简单的东西我遗漏了吗?关于如何重构LINQ语句以获得更好的结果,您有什么想法吗?

它真的需要转换为LINQ吗?我建议您将该查询放在存储过程中,因为等效的LINQ查询非常难以读取和维护。

它真的需要转换为LINQ吗?我建议您将该查询放在存储过程中,因为等效的LINQ查询令人痛苦地无法读取和维护。

请尝试此查询,并告诉我它是否有效。我将连接更改为where子句,这将消除LINQ在转换为SQL时生成的所有复杂子查询

我不确定我是否把左边的外部连接部分弄对了。我只是包含了一个OR条件,用于测试是否存在一边

from p in dbFAS.Products
from ltt in dbFAS.LevelThreeTracking
where p.CategoryName == "CategoryName"
    && (p.Date == ltt.Date || p.Date)
    && (p.CategoryName == ltt.CategoryName || p.CategoryName)
    && (p.ProductName == ltt.ProductName || p.ProductName)
    && p.Quantity > 0
group p by new {p.Date, p.CategoryName, p.ProductName, p.Quantity, p.Sales, ltt.Level3}
into gp
select new
{
    gp.Key.Date,
    gp.Key.CategoryName,
    gp.Key.ProductName,
    Quantity = gp.Sum(hp=>hp.Quantity),
    TotalSales = gp.Sum(hp=>hp.Sales),
    ltt.Level3
};
编辑: 我想了很多,这可能会更清楚一点,甚至可以编译!最后一个不会,因为| |子句

from gp in
    (from p in dbFAS.Products
    join ltt in dbFAS.LevelThreeTracking on 
        new {p.Date, p.CategoryName, p.ProductName}
        equals new {ltt.Date, ltt.CategoryName, ltt.ProductName}
        into temp
    where p.CategoryName == "CategoryName"
        && p.Quantity > 0
    from t in temp.DefaultIfEmpty()
    select new
    {
        p.Date,
        p.CategoryName,
        p.ProductName,
        p.Quantity,
        p.Sales,
        t.Level3
    })
group gp by new {gp.Date, gp.CategoryName, gp.ProductName, gp.Level3}
select new
{
    gp.Key.Date,
    gp.Key.CategoryName,
    gp.Key.ProductName,
    Quantity = gp.Sum(hp=>hp.Quantity),
    TotalSales = gp.Sum(hp=>hp.Sales),
    gp.Level3
}

尝试此查询并让我知道它是否有效。我将连接更改为where子句,这将消除LINQ在转换为SQL时生成的所有复杂子查询

我不确定我是否把左边的外部连接部分弄对了。我只是包含了一个OR条件,用于测试是否存在一边

from p in dbFAS.Products
from ltt in dbFAS.LevelThreeTracking
where p.CategoryName == "CategoryName"
    && (p.Date == ltt.Date || p.Date)
    && (p.CategoryName == ltt.CategoryName || p.CategoryName)
    && (p.ProductName == ltt.ProductName || p.ProductName)
    && p.Quantity > 0
group p by new {p.Date, p.CategoryName, p.ProductName, p.Quantity, p.Sales, ltt.Level3}
into gp
select new
{
    gp.Key.Date,
    gp.Key.CategoryName,
    gp.Key.ProductName,
    Quantity = gp.Sum(hp=>hp.Quantity),
    TotalSales = gp.Sum(hp=>hp.Sales),
    ltt.Level3
};
编辑: 我想了很多,这可能会更清楚一点,甚至可以编译!最后一个不会,因为| |子句

from gp in
    (from p in dbFAS.Products
    join ltt in dbFAS.LevelThreeTracking on 
        new {p.Date, p.CategoryName, p.ProductName}
        equals new {ltt.Date, ltt.CategoryName, ltt.ProductName}
        into temp
    where p.CategoryName == "CategoryName"
        && p.Quantity > 0
    from t in temp.DefaultIfEmpty()
    select new
    {
        p.Date,
        p.CategoryName,
        p.ProductName,
        p.Quantity,
        p.Sales,
        t.Level3
    })
group gp by new {gp.Date, gp.CategoryName, gp.ProductName, gp.Level3}
select new
{
    gp.Key.Date,
    gp.Key.CategoryName,
    gp.Key.ProductName,
    Quantity = gp.Sum(hp=>hp.Quantity),
    TotalSales = gp.Sum(hp=>hp.Sales),
    gp.Level3
}

这是完全可行的,我的下一步,如果没有人提出任何建议,但我想知道我的结构是否有缺陷…为什么你会被否决,兄弟!!。。有些人就是太苛刻了-有没有令人信服的理由这一定是一个LINQ查询?如果不是,那么请不要为了自己的利益而使用LINQ——在这些情况下,从长远来看,它实际上会在可读性和可维护性方面对您造成伤害。没有什么特别的原因。为整体设计投票,为正确的工作选择正确的工具。但问题的关键在于了解LINQ的边界在哪里,以及重构如何提供更好的结果。当然,我可以编写SQL,我把它放在一个问题中LINQ和SQL代码一样容易维护,如果你知道你的LINQ和你的SQL一样好的话。尽管如此,使用LINQ有很多优点,这是完全可行的,如果没有人提出任何建议,我的下一步就是这么做,但我想知道我的结构是否有缺陷…为什么你会被否决兄弟!!。。有些人就是太苛刻了-有没有令人信服的理由这一定是一个LINQ查询?如果不是,那么请不要为了自己的利益而使用LINQ——在这些情况下,从长远来看,它实际上会在可读性和可维护性方面对您造成伤害。没有什么特别的原因。为整体设计投票,为正确的工作选择正确的工具。但问题的关键在于了解LINQ的边界在哪里,以及重构如何提供更好的结果。当然,我可以编写SQL,我把它放在一个问题中LINQ和SQL代码一样容易维护,如果你知道你的LINQ和你的SQL一样好的话。尽管如此,使用LINQ有很多优点,