C# EF DBContext-查询加载的内容超出了我的需要
我的存储库中有此代码 我想加载带有依赖项的Place对象(它在PlaceCompleteQuery中定义)。类型具有属性TypeTranslations GetPlaceAsync方法应该按Id和源加载Place,并且应该只加载加载类型的一个类型转换实例(调用方法LoadTranslationAsync(…)-此方法实际上只加载一个类型转换实例) 在我对数据库在Managament Studio中执行SQL命令的情况下,结果只有一行。SQL命令不包含任何类型转换 执行查询之前的我的上下文: 以及我执行查询后的结果变量:C# EF DBContext-查询加载的内容超出了我的需要,c#,sql,entity-framework,linq-to-sql,dbcontext,C#,Sql,Entity Framework,Linq To Sql,Dbcontext,我的存储库中有此代码 我想加载带有依赖项的Place对象(它在PlaceCompleteQuery中定义)。类型具有属性TypeTranslations GetPlaceAsync方法应该按Id和源加载Place,并且应该只加载加载类型的一个类型转换实例(调用方法LoadTranslationAsync(…)-此方法实际上只加载一个类型转换实例) 在我对数据库在Managament Studio中执行SQL命令的情况下,结果只有一行。SQL命令不包含任何类型转换 执行查询之前的我的上下文: 以
我的问题是,是什么导致了这种不想要的行为?可能是懒惰加载在某个地方。您是否明确禁用了延迟加载?我没有。当惰性加载被禁用时,它会像我预期的那样工作。那么这对您来说是一个可行的解决方案吗?目前它是一个足够的解决方案。也许我会回来研究为什么我的模型在将来会倾向于延迟加载。
private IQueryable<Place> placeCompleteQuery;
protected IQueryable<Place> PlaceCompleteQuery
{
get
{
return this.placeCompleteQuery ?? (this.placeCompleteQuery = this.DbContext.Places.Include(p => p.Address)
.Include(p => p.CreatedBy)
.Include(p => p.Source)
.Include(p => p.Type)
.Include(p => p.ExternalMappings));
}
}
public async Task<Place> GetPlaceAsync(string id, string source, int languageId)
{
IQueryable<Place> query =
PlaceCompleteQuery.Where(p => p.ExternalMappings.Any(m => m.Source.Name.ToLower() == source.ToLower() && m.ExternalId == id));
Place result = await query.SingleOrDefaultAsync();
await this.LoadTranslationsAsync(languageId, result);
return result;
}
private async Task LoadTranslationsAsync(int languageId, Place result)
{
await this.DbContext.PlaceTypeTranslations.Where(t => t.LanguageId == languageId && t.PlaceTypeId == result.Type.Id)
.LoadAsync();
}
exec sp_executesql N'SELECT
[Project3].[Id] AS [Id],
[Project3].[Discriminator] AS [Discriminator],
[Project3].[Name] AS [Name],
[Project3].[PlaceTypeId] AS [PlaceTypeId],
[Project3].[SourceId] AS [SourceId],
[Project3].[AddressId] AS [AddressId],
[Project3].[CreateByUserId] AS [CreateByUserId],
[Project3].[Location] AS [Location],
[Project3].[AvgRate] AS [AvgRate],
[Project3].[Url] AS [Url],
[Project3].[Mail] AS [Mail],
[Project3].[Phone] AS [Phone],
[Project3].[CreateDate] AS [CreateDate],
[Project3].[Id1] AS [Id1],
[Project3].[Street] AS [Street],
[Project3].[StreetNo] AS [StreetNo],
[Project3].[City] AS [City],
[Project3].[PostalCode] AS [PostalCode],
[Project3].[Country] AS [Country],
[Project3].[Id2] AS [Id2],
[Project3].[Name1] AS [Name1],
[Project3].[NickName] AS [NickName],
[Project3].[CreateDate1] AS [CreateDate1],
[Project3].[Id3] AS [Id3],
[Project3].[Name2] AS [Name2],
[Project3].[Description] AS [Description],
[Project3].[C1] AS [C1],
[Project3].[Id4] AS [Id4],
[Project3].[PlaceId] AS [PlaceId],
[Project3].[ExternalId] AS [ExternalId],
[Project3].[SourceId1] AS [SourceId1]
FROM ( SELECT
[Limit1].[Id] AS [Id],
[Limit1].[Name] AS [Name],
[Limit1].[PlaceTypeId] AS [PlaceTypeId],
[Limit1].[SourceId] AS [SourceId],
[Limit1].[AddressId] AS [AddressId],
[Limit1].[CreateByUserId] AS [CreateByUserId],
[Limit1].[Location] AS [Location],
[Limit1].[AvgRate] AS [AvgRate],
[Limit1].[Url] AS [Url],
[Limit1].[Mail] AS [Mail],
[Limit1].[Phone] AS [Phone],
[Limit1].[CreateDate] AS [CreateDate],
[Limit1].[Discriminator] AS [Discriminator],
[Limit1].[Id1] AS [Id1],
[Limit1].[Street] AS [Street],
[Limit1].[StreetNo] AS [StreetNo],
[Limit1].[City] AS [City],
[Limit1].[PostalCode] AS [PostalCode],
[Limit1].[Country] AS [Country],
[Limit1].[Id2] AS [Id2],
[Limit1].[Name1] AS [Name1],
[Limit1].[NickName] AS [NickName],
[Limit1].[CreateDate1] AS [CreateDate1],
[Limit1].[Id3] AS [Id3],
[Limit1].[Name2] AS [Name2],
[Limit1].[Description] AS [Description],
[Extent7].[Id] AS [Id4],
[Extent7].[PlaceId] AS [PlaceId],
[Extent7].[ExternalId] AS [ExternalId],
[Extent7].[SourceId] AS [SourceId1],
CASE WHEN ([Extent7].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM (SELECT TOP (2)
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[PlaceTypeId] AS [PlaceTypeId],
[Extent1].[SourceId] AS [SourceId],
[Extent1].[AddressId] AS [AddressId],
[Extent1].[CreateByUserId] AS [CreateByUserId],
[Extent1].[Location] AS [Location],
[Extent1].[AvgRate] AS [AvgRate],
[Extent1].[Url] AS [Url],
[Extent1].[Mail] AS [Mail],
[Extent1].[Phone] AS [Phone],
[Extent1].[CreateDate] AS [CreateDate],
[Extent1].[Discriminator] AS [Discriminator],
[Extent2].[Id] AS [Id1],
[Extent2].[Street] AS [Street],
[Extent2].[StreetNo] AS [StreetNo],
[Extent2].[City] AS [City],
[Extent2].[PostalCode] AS [PostalCode],
[Extent2].[Country] AS [Country],
[Extent3].[Id] AS [Id2],
[Extent3].[Name] AS [Name1],
[Extent3].[NickName] AS [NickName],
[Extent3].[CreateDate] AS [CreateDate1],
[Extent4].[Id] AS [Id3],
[Extent4].[Name] AS [Name2],
[Extent4].[Description] AS [Description]
FROM [dbo].[Places] AS [Extent1]
INNER JOIN [dbo].[Addresses] AS [Extent2] ON [Extent1].[AddressId] = [Extent2].[Id]
INNER JOIN [dbo].[Users] AS [Extent3] ON [Extent1].[CreateByUserId] = [Extent3].[Id]
INNER JOIN [dbo].[Sources] AS [Extent4] ON [Extent1].[SourceId] = [Extent4].[Id]
WHERE ([Extent1].[Discriminator] IN (N''PlaceDto'',N''Place'')) AND ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[ExternalMappings] AS [Extent5]
INNER JOIN [dbo].[Sources] AS [Extent6] ON [Extent5].[SourceId] = [Extent6].[Id]
WHERE ([Extent1].[Id] = [Extent5].[PlaceId]) AND ((((LOWER([Extent6].[Name])) = (LOWER(@p__linq__0))) AND ( NOT ((LOWER([Extent6].[Name]) IS NULL) OR (LOWER(@p__linq__0) IS NULL)))) OR ((LOWER([Extent6].[Name]) IS NULL) AND (LOWER(@p__linq__0) IS NULL))) AND ([Extent5].[ExternalId] = @p__linq__1) AND (@p__linq__1 IS NOT NULL)
)) ) AS [Limit1]
LEFT OUTER JOIN [dbo].[ExternalMappings] AS [Extent7] ON [Limit1].[Id] = [Extent7].[PlaceId]
) AS [Project3]
ORDER BY [Project3].[Id] ASC, [Project3].[Id1] ASC, [Project3].[Id2] ASC, [Project3].[Id3] ASC, [Project3].[PlaceTypeId] ASC, [Project3].[C1] ASC',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'FourSquare',@p__linq__1=N'1'