Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
[InlineData(2,1)]
[InlineData(3,1)]
[InlineData(4,2)]
[InlineData(5,3)]
[InlineData(6,1)]
public void ShouldGetAllCarsForAMakeExplicitlyWithQueryFilters(
int makeId, int carCount)
{
var make = Context.Makes.First(x => x.Id == makeId);
IQueryable<Car> query = Context.Entry(make).Collection(c => c.Cars).Query();
var qs = query.ToQueryString();
query.Load();
Assert.Equal(carCount,make.Cars.Count());
}
Этот тест похож на тест
ShouldGetTheCarsByMake()
Car
MakeId
Make
Car
Make
DECLARE @__p_0 int = 5;
SELECT [i].[Id], [i].[Color], [i].[IsDrivable], [i].[MakeId],
[i].[PetName], [i].[TimeStamp]
FROM [dbo].[Inventory] AS [i]
WHERE ([i].[IsDrivable] = CAST(1 AS bit)) AND ([i].[MakeId] = @__p_0)
Обратите внимание на то, что фильтр запросов по-прежнему применяется, хотя главной сущностью в запросе является запись
Make
IgnoreQueryFilters()
Query()
MakeTests.cs
[Theory]
[InlineData(1, 2)]
[InlineData(2, 1)]
[InlineData(3, 1)]
[InlineData(4, 2)]
[InlineData(5, 3)]
[InlineData(6, 1)]
public void ShouldGetAllCarsForAMakeExplicitly(int makeId, int carCount)
{
var make = Context.Makes.First(x => x.Id == makeId);
IQueryable<Car> query =
Context.Entry(make).<b>Collection(c => c.Cars).Query().IgnoreQueryFilters()</b>;
var qs = query.IgnoreQueryFilters().ToQueryString();
query.Load();
Assert.Equal(carCount, make.Cars.Count());
}
Выполнение запросов SQL с помощью LINQ
Если оператор LINQ для отдельного запроса слишком сложен или тестирование показывает, что производительность оказалась ниже, чем желаемая, тогда данные можно извлекать с использованием низкоуровневого оператора SQL через метод
FromSqlRaw()
FromSqlInterpolated()
DbSet<T>
SELECT
FromSqlRaw()/FromSqlInterpolated()
Если оператор завершен или содержит код SQL, который не может быть достроен (скажем, задействует общие табличные выражения), то такой запрос все равно выполняется на серверной стороне, но любая дополнительная фильтрация и обработка должна делаться на клиентской стороне как LINQ to Objects. Метод
FromSqlRaw()
FromSqlInterpolated()
CarTests.cs
[Fact]
public void ShouldNotGetTheLemonsUsingFromSql()
{
var entity = Context.Model.FindEntityType($"{typeof(Car).FullName}");
var tableName = entity.GetTableName();
var schemaName = entity.GetSchema();
<b> var cars = Context.Cars.FromSqlRaw($"Select * from {schemaName}.{tableName}")</b>
<b> .ToList();</b>
Assert.Equal(9, cars.Count);
}
[Fact]
public void ShouldGetTheCarsUsingFromSqlWithIgnoreQueryFilters()
{
var entity = Context.Model.FindEntityType($"{typeof(Car).FullName}");
var tableName = entity.GetTableName();
var schemaName = entity.GetSchema();
<b> var cars = Context.Cars.FromSqlRaw($"Select * from {schemaName}.{tableName}")</b>
<b> .IgnoreQueryFilters().ToList();</b>
Assert.Equal(10, cars.Count);
}
[Fact]
public void ShouldGetOneCarUsingInterpolation()
{
var carId = 1;