Entity Framework : extra call to database on Parent Table - entity-framework

My model is simple
public partial class Customer
{
public Customer()
{
this.Orders = new HashSet<Order>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
public partial class Order
{
public Order()
{
this.OrderDetails = new HashSet<OrderDetail>();
}
public int Id { get; set; }
public string OrderDescription { get; set; }
public int CustomerId { get; set; }
public virtual Customer Customer { get; set; }
public virtual ICollection<OrderDetail> OrderDetails { get; set; }
}
public partial class OrderDetail
{
public int Id { get; set; }
public int OrderId { get; set; }
public string ProductName { get; set; }
}
This code was generated using EF's .edmx file. Then I generated my database from this model. I am doing eager loading to fetch data.
public virtual IQueryable<T> GetAllEagerLoadSelective(string[] children)
{
foreach (var item in children)
{
DbSet.Include(item).Load();
}
return DbSet;
}
and my call looks like
string[] Navs = { "OrderDetails" };
var orders = VNUow.Order.GetAllEagerLoadSelective(Navs);
var temp = orders.ToList();
return temp;
LazyLoading is set to false .
There are two queries being run, The first one makes sense
SELECT
[Project1].[Id] AS [Id],
[Project1].[OrderDescription] AS [OrderDescription],
[Project1].[CustomerId] AS [CustomerId],
[Project1].[C1] AS [C1],
[Project1].[Id1] AS [Id1],
[Project1].[OrderId] AS [OrderId],
[Project1].[ProductName] AS [ProductName]
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Extent1].[OrderDescription] AS [OrderDescription],
[Extent1].[CustomerId] AS [CustomerId],
[Extent2].[Id] AS [Id1],
[Extent2].[OrderId] AS [OrderId],
[Extent2].[ProductName] AS [ProductName],
CASE WHEN ([Extent2].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM [dbo].[Orders] AS [Extent1]
LEFT OUTER JOIN [dbo].[OrderDetails] AS [Extent2] ON [Extent1].[Id] = [Extent2].[OrderId]
) AS [Project1]
ORDER BY [Project1].[Id] ASC, [Project1].[C1] ASC
but why is there this second query? A select on the parent table...
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[OrderDescription] AS [OrderDescription],
[Extent1].[CustomerId] AS [CustomerId]
FROM [dbo].[Orders] AS [Extent1]

You are calling Load() to populate the internal sets, which is what creates the first query. Then you're returning the dbSet. Then you call ToList() on the DbSet which is effectively another query entirely. The only time querying a DbSet does not result in a database query is when you use the Find() function to retrieve an entity that has already been loaded. Everything else is a query to the db even if it is only returning entities that have already been loaded.
To fix this, change GetAllEagerLoadSelective like so:
public virtual IList<T> GetAllEagerLoadSelective(string[] children)
{
IQueryable<T> dbSet = DbSet;
foreach (var item in children)
{
dbSet = dbSet.Include(item);
}
return dbSet.ToList();
}

Related

EF Code First is creating query with wrong columns

I am using EF 6.0 and creating my database views using code first. I have a small sample that works fine. I'm trying to migrate to another set of views. For some reason I am getting the wrong column name on the query for one of the columns. It seems to be bring in the column from the other view I'm joining to.
I've tried to change the [Key] columns on the tables but it just doesn't seem to change.
The view vABC consists of columns: name varchar(30) and desc varchar(100)
The view vXYZ consists of columns: name varchar(30) and amount float
They will join to each other on name.
This is a snippet of the query I am running:
var name = dataRecord.Cells[0].Value.ToString();
var query = from b in _context.XYZ
.Where(b => b.name == name)
select b;
This is returning:
SELECT
1 AS [C1],
[Extent1].[name] AS [name],
[Extent1].[amount] AS [amount],
[Extent1].[ABC_name] AS [ABC_name]
FROM [dbo].[vXYZ] AS [Extent1]
WHERE [Extent1].[name] = #p__linq__0
I will attached the classes and dbcontext below.
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Mynamespace
{
[Table("vABC")]
public class ABC
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public ABC()
{
XYZs= new HashSet<XYZ>();
}
[Key]
[StringLength(150)]
public string name { get; set; }
[StringLength(150)]
public string Desc { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<XYZ> XYZs{ get; set; }
}
}
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Mynamespace
{
[Table("vXYZ")]
public class Price
{
[Key]
[Required]
[StringLength(200)]
public string name{ get; set; }
public decimal? amount{ get; set; }
public virtual ABC ABC{ get; set; }
}
}
namespace Mynamespace
{
using System.Data.Entity;
public partial class myContext : DbContext
{
public myContext () : base("name=myContext ")
{
Database.SetInitializer<myContext >(null);
}
public virtual DbSet<ABC> ABCs { get; set; }
public virtual DbSet<XYZ> XYZs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<XYZ>()
.Property(e => e.amount)
.HasPrecision(19, 4);
}
}
}
I am expecting query to be
SELECT [Extent1].[name] AS [name],
[Extent1].[amount] AS [amount]
FROM [dbo].[vXYZ] AS [Extent1]
WHERE [Extent1].[name] = #p__linq__0

Get related entity id without loading it

I need to list all the orders with their corresponding customer ID using Entity Framework (Code First). This should be possible without querying the Customers table since the customer ID is a FK in the Orders table. However, EF generates selects against the Orders and the Customers tables as well.
This is the entities model and the code used to query Orders:
public class Order
{
public virtual Guid Id { get; set; }
public virtual string Description { get; set; }
public virtual Customer Customer { get; set; }
}
public class Customer
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
}
using (var context = new LazyLoadingEfContext())
{
foreach (var order in context.Orders)
{
Console.WriteLine("Order {0}, Customer {1}", order.Description, order.Customer.Id);
}
}
The SQL generated is the following:
SELECT
1 AS [C1],
[Extent1].[Id] AS [Id],
[Extent1].[Description] AS [Description],
[Extent1].[Customer_Id] AS [Customer_Id]
FROM [dbo].[Orders] AS [Extent1]
exec sp_executesql N'SELECT
[Extent2].[Id] AS [Id],
[Extent2].[Name] AS [Name]
FROM [dbo].[Orders] AS [Extent1]
INNER JOIN [dbo].[Customers] AS [Extent2] ON [Extent1].[Customer_Id] = [Extent2].[Id]
WHERE ([Extent1].[Customer_Id] IS NOT NULL) AND ([Extent1].[Id] =
#EntityKeyValue1)',N'#EntityKeyValue1 uniqueidentifier',
#EntityKeyValue1='FF947EF3-5A3F-4A26-BDB9-039C49F559A7'
(plus other identical queries with different values for the parameter #EntityKeyValue1)
Is there any way to configure EF in order to retrieve related entity IDs from the "parent" object instead of loading the related entity?
BTW, I've tested the same scenario using NHibernate and only one query is executed against the Orders table:
SELECT this_.Id as Id1_0_, this_.Description as Descript2_1_0_,
this_.Customer_id as Customer3_1_0_ FROM [Order] this_
Try this:
public class Order
{
public virtual Guid Id { get; set; }
public virtual string Description { get; set; }
public Guid CustomerID { get; set; }
[ForeignKey("CustomerID ")]
public virtual Customer Customer { get; set; }
}
After that you should be able to get just order.CustomerID within your foreach loop, without querying Customers table.

EntityFramework 4 returning all columns when I just want one back

I can't figure out why entityframework is returning me all columns on the below two queries. I'm trying to get it to return me just the date column but back all the columns of db.EmailDetails come when I look at the sql generated (posted below)
var y = (from data1 in db.EmailDetails
join data2 in db.AddressBookEntries on data1.FromAddressBookEntryId equals data2.Id
orderby data1.EmailSendFinishTime descending
select data1.EmailSendFinishTime).FirstOrDefault();
var x =
db.EmailDetails.Where(a => a.User.Username == username && a.FromAddressBookEntry.WhiteList).
Select(a => new
{
a.EmailSendFinishTime
}).
OrderByDescending(
a => a.EmailSendFinishTime)
.FirstOrDefault();
sql generated:
exec sp_executesql N'SELECT TOP (1)
[Project1].[Id] AS [Id],
[Project1].[UserId] AS [UserId],
[Project1].[InValidMailMessage] AS [InValidMailMessage],
[Project1].[MailInternalDate] AS [MailInternalDate],
[Project1].[MessageUniqueId] AS [MessageUniqueId],
[Project1].[FromAddressBookEntryId] AS [FromAddressBookEntryId],
[Project1].[ToEmailAddress] AS [ToEmailAddress],
[Project1].[EmailFolderId] AS [EmailFolderId],
[Project1].[EmailHeaderInfo] AS [EmailHeaderInfo],
[Project1].[EmailSendSmtpServer] AS [EmailSendSmtpServer],
[Project1].[EmailSendStatus] AS [EmailSendStatus],
[Project1].[EmailSendStartTime] AS [EmailSendStartTime],
[Project1].[EmailSendFinishTime] AS [EmailSendFinishTime],
[Project1].[EmailSendLogMessage] AS [EmailSendLogMessage],
[Project1].[Subject] AS [Subject],
[Project1].[MimeMessageFull] AS [MimeMessageFull],
[Project1].[HighPriority] AS [HighPriority],
[Project1].[SentDateTime] AS [SentDateTime],
[Project1].[EmailDeleted] AS [EmailDeleted],
[Project1].[EmailDeletedDateTime] AS [EmailDeletedDateTime],
[Project1].[EmailViewed] AS [EmailViewed],
[Project1].[EmailViewedDateTime] AS [EmailViewedDateTime],
[Project1].[BodyTextForSend] AS [BodyTextForSend],
[Project1].[ReceivedDate] AS [ReceivedDate]
FROM ( SELECT [Extent1].[Id] AS [Id],
[Extent1].[UserId] AS [UserId],
[Extent1].[InValidMailMessage] AS [InValidMailMessage],
[Extent1].[MailInternalDate] AS [MailInternalDate],
[Extent1].[MessageUniqueId] AS [MessageUniqueId],
[Extent1].[FromAddressBookEntryId] AS [FromAddressBookEntryId],
[Extent1].[ToEmailAddress] AS [ToEmailAddress],
[Extent1].[EmailFolderId] AS [EmailFolderId],
[Extent1].[EmailHeaderInfo] AS [EmailHeaderInfo],
[Extent1].[EmailSendSmtpServer] AS [EmailSendSmtpServer],
[Extent1].[EmailSendStatus] AS [EmailSendStatus],
[Extent1].[EmailSendStartTime] AS [EmailSendStartTime],
[Extent1].[EmailSendFinishTime] AS [EmailSendFinishTime],
[Extent1].[EmailSendLogMessage] AS [EmailSendLogMessage],
[Extent1].[Subject] AS [Subject],
[Extent1].[MimeMessageFull] AS [MimeMessageFull],
[Extent1].[HighPriority] AS [HighPriority],
[Extent1].[SentDateTime] AS [SentDateTime],
[Extent1].[EmailDeleted] AS [EmailDeleted],
[Extent1].[EmailDeletedDateTime] AS [EmailDeletedDateTime],
[Extent1].[EmailViewed] AS [EmailViewed],
[Extent1].[EmailViewedDateTime] AS [EmailViewedDateTime],
[Extent1].[BodyTextForSend] AS [BodyTextForSend],
[Extent1].[ReceivedDate] AS [ReceivedDate]
FROM [dbo].[EmailDetails] AS [Extent1]
INNER JOIN [dbo].[Users] AS [Extent2] ON [Extent1].[UserId] =
[Extent2].[Id]
INNER JOIN [dbo].[AddressBookEntries] AS [Extent3] ON
[Extent1].[FromAddressBookEntryId] = [Extent3].[Id]
WHERE ([Extent2].[Username] = #p__linq__0) AND
([Extent3].[WhiteList] = 1)) AS [Project1]
ORDER BY [Project1].[EmailSendFinishTime] DESC',N'#p__linq__0 nvarchar(4000)
',#p__linq__0=N'ekellner9
EmailDetail Definition and AddressBookEntry Definition
public class EmailDetail
{
public EmailDetail()
{
// keep sqlserver from blowing up with no datetime set
EmailSendStartTime = new DateTime(1900, 1, 1);
EmailSendFinishTime = new DateTime(1900, 1, 1);
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[ForeignKey("User")]
public long UserId { get; set; }
[Required(ErrorMessage = "Must have user associted with EmailDetail")]
public User User { get; set; }
public long? FromAddressBookEntryId { get; set; }
public AddressBookEntry FromAddressBookEntry { get; set; }
public DateTime EmailSendStartTime { get; set; }
public DateTime EmailSendFinishTime { get; set; }
}
public class AddressBookEntry
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[ForeignKey("User")]
public long UserId { get; set; }
[Required]
public User User { get; set; }
[MaxLength(512)]
[Required(ErrorMessage = "Email is required")]
public string Email { get; set; }
}
I'm not getting the same results as you. Using the following console app:
public class EmailDetail
{
public EmailDetail()
{
// keep sqlserver from blowing up with no datetime set
EmailSendStartTime = new DateTime(1900, 1, 1);
EmailSendFinishTime = new DateTime(1900, 1, 1);
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[ForeignKey("User")]
public long UserId { get; set; }
[Required(ErrorMessage = "Must have user associted with EmailDetail")]
public User User { get; set; }
public long? FromAddressBookEntryId { get; set; }
public AddressBookEntry FromAddressBookEntry { get; set; }
public DateTime EmailSendStartTime { get; set; }
public DateTime EmailSendFinishTime { get; set; }
}
public class AddressBookEntry
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[ForeignKey("User")]
public long UserId { get; set; }
[Required]
public User User { get; set; }
[MaxLength(512)]
[Required(ErrorMessage = "Email is required")]
public string Email { get; set; }
public bool WhiteList { get; set; }
}
public class User
{
public long UserId { get; set; }
public string Username { get; set; }
}
public class CFContext : DbContext
{
public DbSet<AddressBookEntry> AddressBookEntries { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<EmailDetail> EmailDetails { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
class Program
{
static void Main(string[] args)
{
var db = new CFContext();
var y = (from data1 in db.EmailDetails
join data2 in db.AddressBookEntries on data1.FromAddressBookEntryId equals data2.Id
orderby data1.EmailSendFinishTime descending
select data1.EmailSendFinishTime).FirstOrDefault();
string username = "1";
var x = db.EmailDetails.Where(a => a.User.Username == username && a.FromAddressBookEntry.WhiteList).
Select(a => new
{
a.EmailSendFinishTime
}).
OrderByDescending(
a => a.EmailSendFinishTime)
.FirstOrDefault();
Console.WriteLine(y);
Console.WriteLine(x);
}
}
I got these SQL queries
SELECT TOP (1)
[Extent1].[EmailSendFinishTime] AS [EmailSendFinishTime]
FROM [dbo].[EmailDetails] AS [Extent1]
WHERE [Extent1].[FromAddressBookEntryId] IS NOT NULL
ORDER BY [Extent1].[EmailSendFinishTime] DESC
SELECT TOP (1)
[Project1].[C1] AS [C1],
[Project1].[EmailSendFinishTime] AS [EmailSendFinishTime]
FROM ( SELECT
[Extent1].[EmailSendFinishTime] AS [EmailSendFinishTime],
1 AS [C1]
FROM [dbo].[EmailDetails] AS [Extent1]
INNER JOIN [dbo].[Users] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[UserId]
INNER JOIN [dbo].[AddressBookEntries] AS [Extent3] ON [Extent1].[FromAddressBookEntryId] = [Extent3].[Id]
WHERE ([Extent2].[Username] = #p__linq__0) AND ([Extent3].[WhiteList] = 1)
) AS [Project1]
ORDER BY [Project1].[EmailSendFinishTime] DESC
Is there anything else in your model, or maybe there's something else making the SQL query above?

Code First conventions for foreign keys and table names

Please accept my apologies for the large amount of text, I tried not to miss the details that may affect on something
Entity Framework 4.3.1
My Model:
public class Podcast
{
public int Id { get; set; }
public string Title { get; set; }
public int PodcastStatus_Id { get; set; }
public int PodcastType_Id { get; set; }
public virtual PodcastStatus PodcastStatus { get; set; }
public virtual PodcastType PodcastType { get; set; }
public virtual ICollection<CategoryLink> CategoryLinks { get; set; }
}
public class PodcastStatus
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Podcast> Podcasts { get; set; }
}
public class PodcastType
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Podcast> Podcasts { get; set; }
}
Context:
public class EcDbContext : DbContext
{
public DbSet<PodcastType> PodcastTypes { get; set; }
public DbSet<PodcastStatus> PodcastStatuses { get; set; }
public DbSet<Podcast> Podcasts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Podcast>().HasRequired(p => p.PodcastStatus).WithMany(s => s.Podcasts).HasForeignKey(p => p.PodcastStatus_Id);
modelBuilder.Entity<Podcast>().HasRequired(p => p.PodcastType).WithMany(t => t.Podcasts).HasForeignKey(p => p.PodcastType_Id);
base.OnModelCreating(modelBuilder);
}
}
Query:
db.Podcasts.Where(p => p.PodcastStatus.SysStatus > 0 && p.Title.Contains(search))
.OrderBy(p => p.CreatedDate)
.Skip((page - 1) * PageSize).Take(PageSize)
Here I've deleted some columns from the Model descriptions so to not complicate things.
I get the following error message: Invalid object name 'dbo.PodcastStatus'. This table is named 'PodcastStatuses' in the database. We will see the following text if we look at the result SQL query:
{SELECT TOP (10)
[Project1].[Id] AS [Id],
[Project1].[Title] AS [Title],
[Project1].[CreatedDate] AS [CreatedDate],
[Project1].[PodcastStatus_Id] AS [PodcastStatus_Id],
[Project1].[PodcastType_Id] AS [PodcastType_Id],
[Project1].[PodcastStatus_Id1] AS [PodcastStatus_Id1],
[Project1].[PodcastType_Id1] AS [PodcastType_Id1]
FROM ( SELECT [Project1].[Id] AS [Id], [Project1].[CastNo] AS [CastNo], [Project1].[Title] AS [Title], [Project1].[OriginalText] AS [OriginalText], [Project1].[TranslateText] AS [TranslateText], [Project1].[CreatedDate] AS [CreatedDate], [Project1].[PodcastStatus_Id] AS [PodcastStatus_Id], [Project1].[PodcastType_Id] AS [PodcastType_Id], [Project1].[ImageFileName] AS [ImageFileName], [Project1].[PodcastStatus_Id1] AS [PodcastStatus_Id1], [Project1].[PodcastType_Id1] AS [PodcastType_Id1], row_number() OVER (ORDER BY [Project1].[CreatedDate] ASC) AS [row_number]
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Title] AS [Title],
[Extent1].[CreatedDate] AS [CreatedDate],
[Extent1].[PodcastStatus_Id] AS [PodcastStatus_Id],
[Extent1].[PodcastType_Id] AS [PodcastType_Id],
[Extent1].[PodcastStatus_Id1] AS [PodcastStatus_Id1],
[Extent1].[PodcastType_Id1] AS [PodcastType_Id1]
FROM [dbo].[Podcasts] AS [Extent1]
INNER JOIN [dbo].[PodcastStatus] AS [Extent2] ON [Extent1].[PodcastStatus_Id] = [Extent2].[Id]
WHERE ([Extent2].[SysStatus] > 0) AND ((N'' = #p__linq__0) OR ([Extent1].[Title] LIKE #p__linq__1 ESCAPE N'~'))
) AS [Project1]
) AS [Project1]
WHERE [Project1].[row_number] > 0
ORDER BY [Project1].[CreatedDate] ASC}
PodcastStatus_Id1, PodcastStatus_Id1, [dbo].[PodcastStatus] (and not 'statusES'), [PodcastStatus_Id] = [Extent2].[Id]
Why? I don't understand what did I do wrong...
Can somebody help?
Thanks!
It looks like a problem when EF pluralizes names when generating the database - I ran across something like this a while ago but I forget which EF version.
You can force EF to name a table by using (although you will likely need to drop/recreate the database) :
[Table("PodcastStatus")]
public class PodcastStatus
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Podcast> Podcasts { get; set; }
}

Entity Framework Code First One-To-Many doing wrong queries?

So I have a model
public class Player
{
public int PlayerId { get; set; }
[Required]
public string Name2 { get; set; }
public string Cv { get; set; }
public int TeamId { get; set; }
public virtual Team Team { get; set; }
}
public class Team
{
public int TeamId { get; set; }
[Required]
public string Name { get; set; }
public string City { get; set; }
public DateTime Founded { get; set; }
public virtual IList<Player> Players { get; set; }
}
My Teams table in DB contains records, my Players table in DB does not contain any (empty).
When I run this query:
IQueryable<Player> query = playerRepository.All.Include(p => p.Team);
return View((query);
I get this query in DB (via profiler):
SELECT
[Project1].[TeamId] AS [TeamId],
[Project1].[Name] AS [Name],
[Project1].[City] AS [City],
[Project1].[Founded] AS [Founded],
[Project1].[C1] AS [C1],
[Project1].[PlayerId] AS [PlayerId],
[Project1].[Name2] AS [Name2],
[Project1].[Cv] AS [Cv],
[Project1].[TeamId1] AS [TeamId1]
FROM ( SELECT
[Limit1].[TeamId] AS [TeamId],
[Limit1].[Name] AS [Name],
[Limit1].[City] AS [City],
[Limit1].[Founded] AS [Founded],
[Extent2].[PlayerId] AS [PlayerId],
[Extent2].[Name2] AS [Name2],
[Extent2].[Cv] AS [Cv],
[Extent2].[TeamId] AS [TeamId1],
CASE WHEN ([Extent2].[PlayerId] IS NULL) THEN CAST(NULL AS int)
ELSE 1
END AS [C1]
FROM ( SELECT TOP (10) [c].[TeamId] AS [TeamId],
[c].[Name] AS [Name],
[c].[City] AS [City],
[c].[Founded] AS [Founded]
/* HERE */
FROM [dbo].[Teams] AS [c]
) AS [Limit1]
/* AND HERE */
LEFT OUTER JOIN [dbo].[Players] AS [Extent2]
ON [Limit1].[TeamId] = [Extent2].[TeamId]
) AS [Project1]
ORDER BY [Project1].[TeamId] ASC, [Project1].[C1] ASC
Which as a result I get one empty row shown on the screen. This is because this joins are done in wrong order...instead of joining Teams on Players, I get Players on Teams...which in turn means that even though I have NO players in the DB, I get an empty row in the grid.
Anyone have any ideas why???
Vladan
You must be doing something wrong or you are looking at wrong query. I used your entities and your linq query:
var data = context.Players.Include(p => p.Team).ToList();
and I get this SQL query:
SELECT
[Extent1].[PlayerId] AS [PlayerId],
[Extent1].[Name2] AS [Name2],
[Extent1].[Cv] AS [Cv],
[Extent1].[TeamId] AS [TeamId],
[Extent2].[TeamId] AS [TeamId1],
[Extent2].[Name] AS [Name],
[Extent2].[City] AS [City],
[Extent2].[Founded] AS [Founded]
FROM [dbo].[Players] AS [Extent1]
INNER JOIN [dbo].[Teams] AS [Extent2] ON [Extent1].[TeamId] = [Extent2].[TeamId]
But if I use this query:
var data = context.Teams.Include(t => t.Players).Take(10).ToList();
I will get exactly your SQL query. TOP (10) and reverse table querying will not appear without reason.