【问题标题】:SQL Query to LINQSQL 查询到 LINQ
【发布时间】:2010-11-28 00:05:35
【问题描述】:

我想将此查询转换为 LINQ 以用于 Entity Framework 4。

Select *, 
(select SUM(Of_Orders.Contribution) from Of_Orders
where Of_Orders.CauseID = Of_Causes.CauseID) AS Earned
FROM Of_Causes

谁能帮我做这件事。

提前致谢

【问题讨论】:

    标签: c# linq linq-to-sql entity-framework entity-framework-4


    【解决方案1】:

    像 CauseID 字段代表外键一样酷吗?如果是这样,那么您可以在实体模型中映射关联,以便 cause.Orders 是您可以访问的属性。旁注,您还可以重命名实体/属性,它们不必匹配表名,因此您可以摆脱丑陋的下划线!然后看起来像这样:

    var result = from c in context.Of_Causes
    select new {cause, cause.Orders.Sum(o => o.Contribution}
    

    您会从中获得一些好处(如果可以的话),例如更简洁的模型,以及生成更高效的 SQL 查询。

    如果您不能使用外键,我会手动加入表,这再次有助于提高性能。

    我相信这看起来像这样,但我从 VB 到 C# 的翻译可能很狡猾,这里是 C#:

    var context = new ModelContainer();
    var result = from c in context.Of_Cause
                 join o in context.Of_Orders on c.Id equals o.CauseID into g
                 select new {Cause = c, Total = g.Sum(o => o.Contribution)};
    

    如果我的翻译被关闭,这是 VB 原版!

    Dim result = From cause As Of_Cause In context.Of_Cause
                 Group Join order As Of_Orders In context.Of_Orders On order.CauseID Equals cause.Id Into total = Sum(order.Contribution)
                 Select New With {.Cause = cause, .Total = total}
    

    【讨论】:

    • 嗨,这是一个很酷的解释。每当我们“选择新”时,你能帮我做一件事吗?它会创建一个匿名类型。我想创建一个 Cause 类型的列表,并希望将 Total 存储在 Cause 对象的属性中,我应该怎么做?
    • 是的,没问题,但你能把它当作一个新问题来问吗?除了注释之外,由于没有代码等,在 cmets 框中不能轻松地做很多事情。
    【解决方案2】:

    这类似于:

    from cause in context.Of_Causes
    select new {
        cause,
        Earned = context.Of_Orders.Where(o => o.CauseID == cause.CauseID).Sum(o => o.Contribution)
    };
    

    我对所涉及的类型做了一些假设,但这对你来说应该很容易解决。

    【讨论】:

    • 那是我已经完成的事情,但是“选择新”正在创建一个匿名类型,但我想创建一个原因类型列表。
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多