【问题标题】:How to query data from entity object along with ICollection data如何从实体对象中查询数据以及 ICollection 数据
【发布时间】:2012-07-11 16:15:47
【问题描述】:

我有这些课程

public class CoffeeUser
{
    public CoffeeUser()
    {
        DrinkedCoffees = new Collection<DrinkedCoffee>();
    }

    public long CoffeeUserID { get; set; }

    public Guid Code { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EMail { get; set; }

    public virtual ICollection<DrinkedCoffee> DrinkedCoffees { get; set; }
}

public class DrinkedCoffee
{
    public long DrinkedCoffeeID { get; set; }

    public DateTime DateDrinked { get; set; }
}

如何查询 DrinkedCoffees 的所有项目以及 FirstName 和 LastName? 结果应如下所示:

Tyler John 27.3.2012
Tyler John 28.3.2012
Tyler John 29.3.2012

我已经尝试了几个查询,但到目前为止我都不成功。

这是我能做到的最接近的:

    var list_4 = ctx.CoffeeUsers.Where(u => u.DrinkedCoffees.Count > 0).SelectMany(u => u.DrinkedCoffees).ToList();

嗯,我在 sql 中花了 45 秒来完成这项工作。还有 4 小时不做实体 :)

【问题讨论】:

    标签: c# entity-framework-4 code-first


    【解决方案1】:

    怎么样

      var DrinkedCoffies = ctx.CoffeeUsers.SelectMany(u => u.DrinkedCoffees, (u, cof) => new { FirstName = u.FirstName, LastName = u.LastName, DateDrinked = cof.DateDrinked } );
    

    【讨论】:

      【解决方案2】:

      假设您有一个名为 user 的对象,它是 CoffeeUser 的一个实例,您应该能够执行以下操作:

      var drunkCoffees = from coffee in user.DrinkedCoffees
                         select new { user.LastName, user.FirstName, coffee.DateDrinked };
      

      这将返回一个匿名类型的集合,其中包含用户的姓氏、名字和他们喝咖啡的时间。

      编辑只需重新阅读您的问题 - 在您的示例中,您需要执行更多类似这样的操作:

      var drunkCoffees = from coffeeUser in ctx.CoffeeUsers
                         from coffee in coffeeUser.DrinkedCoffees
                         where coffeeUser.DrinkedCoffees.Count > 0
                         select new { user.LastName, user.FirstName, coffee.DateDrinked };
      

      在这里,我从您的 CoffeeUsers 集合中进行选择,然后从他们的 DrinkedCoffees 集合中进行选择,其中计数大于 0。

      然后您可以通过执行以下操作来显示结果:

      foreach(var drunkCoffee in drunkCoffees) {
      
          System.Console.WriteLine(string.format("{0} {1} {2}", drunkCoffee.LastName, drunkCoffee.FirstName, drunkCoffee.DateDrinked));
      
      }
      

      希望有帮助!

      詹姆斯

      【讨论】:

      • 詹姆斯,感谢您非常彻底的回答。我首先看到了 Ashkan 的帖子并使用了他的解决方案,然后又看到了你的。你的帖子实际上澄清了这个问题背后的逻辑。谢谢你。我使 Ashkan 的回答正确,只是因为我首先使用了他的解决方案。无论如何,谢谢你向我解释这个烂摊子:)
      猜你喜欢
      • 2022-06-14
      • 2021-09-01
      • 2016-02-18
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多