2

我有这些课程

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();

好吧,我花了 45 秒在 sql 中执行此操作。还有 4 小时不做实体 :)

4

2 回答 2

2

怎么样

  var DrinkedCoffies = ctx.CoffeeUsers.SelectMany(u => u.DrinkedCoffees, (u, cof) => new { FirstName = u.FirstName, LastName = u.LastName, DateDrinked = cof.DateDrinked } );
于 2012-07-11T08:07:00.177 回答
1

假设您有一个名为 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));

}

希望有帮助!

詹姆士

于 2012-07-11T08:02:30.117 回答