如何查询实体对象中的数据以及ICollection数据

时间:2012-07-11 07:51:43

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

我有这些课程

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小时不在实体中执行:)

2 个答案:

答案 0 :(得分:2)

怎么样

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

答案 1 :(得分: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));

}

希望有所帮助!

詹姆斯