Bar*_*art 26 linq-to-entities ef-code-first entity-framework-4.3
包括matchparticipants不工作.我在调试时总是说Null.但是,当我将GroupBy置于评论中时,它可以正常工作.我使用实体框架4.3.1与代码优先.
实体:
public class Match
{
[ScaffoldColumn(false)]
public int MatchId { get; set; }
[Required(ErrorMessage = "Matchtype is a required field")]
public int Scheme { get; set; }
[Required]
[DefaultValue(false)]
public bool Finished { get; set; }
public int Round { get; set; }
// Relations
[Required]
public Category Category { get; set; }
public Official Official { get; set; }
public Slot Slot { get; set; }
public ICollection<MatchParticipant> MatchParticipants { get; set; }
}
public class MatchParticipant
{
[ScaffoldColumn(false)]
public int MatchParticipantId { get; set; }
public int Points { get; set; }
public int Goals { get; set; }
[Required]
public Match Match { get; set; }
[Required]
public Team Team { get; set; }
}
public class Team
{
[ScaffoldColumn(false)]
public int TeamId { get; set; }
[Required(ErrorMessage="Name is a required field")]
public string Name { get; set; }
[Required(ErrorMessage="Number of players is a required field")]
public int NumberOfPlayers { get; set; }
[Required(ErrorMessage="Coach is a required field")]
public string Coach { get; set; }
[Required(ErrorMessage="Phone is a required field")]
public string Phone { get; set; }
public string CellPhone { get; set; }
public string Fax { get; set; }
[Required(ErrorMessage="Email is a required field")]
public string Email { get; set; }
[Required(ErrorMessage="Address is a required field")]
public Address Address { get; set; }
public Pool Pool { get; set; }
[Required(ErrorMessage = "Category is a required field")]
public Category Category { get; set; }
public ICollection<MatchParticipant> matchParticipants { get; set; }
}
var matches =
context.matches
.Include("Official")
.Include("Slot")
.Include("MatchParticipants.Team")
.Include("Category.Tournament")
.Where(m => m.Category.Tournament.TournamentId == tournamentId)
.GroupBy(m => m.Category);
Run Code Online (Sandbox Code Playgroud)
如何让Include工作?
Lad*_*nka 44
Include要求查询的形状不会改变.这意味着您的查询必须返回IQueryable<Match>.GroupBy运算符可能被认为是形状改变因为它返回IQueryable<IGrouping<TKey, TSource>>.一旦查询的形状改变,所有Include语句都被省略.因此,您不能使用Include投影,自定义连接和分组.
作为一种解决方法,您可以在Linq-to-objects中执行分组:
var matches = context.matches
.Include("Official")
.Include("Slot")
.Include("MatchParticipants.Team")
.Include("Category.Tournament")
.Where(m => m.Category.Tournament.TournamentId == tournamentId)
.ToList()
.GroupBy(m => m.Category);
Run Code Online (Sandbox Code Playgroud)
编辑:正如评论和其他答案中所述,这是非常危险的解决方法,可能导致性能问题.它将所有记录从数据库提取到应用程序,并在应用程序中进行聚合.它可以在相同的情况下工作,但绝对不适用于通用解决方案.
Tom*_*ino 27
在这种特殊情况下,当你的GroupBy是最新的运算符时,这个查询效果很好......但是上面的恕我直言答案对于beginer来说是最糟糕的答案,因为当你的GroupBy没有在它之后执行时它会导致非常优化的查询,但是然后是其他一些陈述(Where,Select ...).
var ctx = new MyDataContext(); // Please use "using"
var result = ctx.SomeTable
//.Include(ah => ah.IncludedTable) // DO NOT PUT IT HERE
.Where(t => t.IsWhateverTrue)
.GroupBy(t => t.MyGroupingKey)
.Select(gt =>
gt.OrderByDescending(d => d.SomeProperty)
.FirstOrDefault(ah => ah.SomeAnotherFilter))
.Include(ah => ah.IncludedTable) // YES, PUT IT HERE
.ToList(); // Execute query here
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11581 次 |
| 最近记录: |