我有这些课程
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小时不在实体中执行:)
答案 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));
}
希望有所帮助!
詹姆斯