c# - 是否可以将 EF Core 查询与 LINQ 和动态字符串查询混合编写​​?

标签 c# entity-framework-core ef-core-2.0

我希望能够在 LINQ 中编写大部分查询,然后将 WHERE 子句编写为字符串,就像动态查询一样。所以类似:

var query = 来自 _context.CurrentInventory 中的部分

query.Where = "part.PartNumber LIKE '%a%' OR part.PartNumber LIKE '%b%'

原因是 WHERE 可能变得非常大,并且使用 EF.Functions.LikeContains 确实会减慢查询速度。

我可以动态构建整个过程并只执行字符串,但我希望避免这种情况。

最佳答案

您可以使用System.Linq.Dynamic这是 based on之前的工作

    Install-Package System.Linq.Dynamic

查询

   query.Where = "part.PartNumber LIKE '%a%' OR part.PartNumber LIKE '%b%'

可以重写为:

    query.Where ("part.PartNumber.Contains(@0) or part.PartNumber.Contains(@1)","a" ,"b")

工作示例位于fiddle

更新:

我将动态 Linq 与 EntityFramework 结合使用

      using (var context = new NorthwindEntities())
        {
            var customers = context.Customers.Where("ContactName.Contains(@0) or ContactName.Contains(@1)", "Maria","Carine").ToList();
            Console.WriteLine(customers.Count);
        }

生成的 Sql(从 sql profiler 中可以看出)是:

    SELECT 
        [Extent1].[CustomerID] AS [CustomerID], 
        [Extent1].[CompanyName] AS [CompanyName], 
        [Extent1].[ContactName] AS [ContactName], 
        [Extent1].[ContactTitle] AS [ContactTitle], 
        [Extent1].[Address] AS [Address], 
        [Extent1].[City] AS [City], 
        [Extent1].[Region] AS [Region], 
        [Extent1].[PostalCode] AS [PostalCode], 
        [Extent1].[Country] AS [Country], 
        [Extent1].[Phone] AS [Phone], 
        [Extent1].[Fax] AS [Fax]
        FROM [dbo].[Customers] AS [Extent1]
     WHERE ([Extent1].[ContactName] LIKE N'%Maria%') OR ([Extent1].[ContactName] LIKE N'%Carine%')

where 条件转换为:

     WHERE ([Extent1].[ContactName] LIKE N'%Maria%') OR ([Extent1].[ContactName] LIKE N'%Carine%')  

关于c# - 是否可以将 EF Core 查询与 LINQ 和动态字符串查询混合编写​​?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49014918/

相关文章:

asp.net-core - 在 EF Core 2.1 中执行异步不可选择存储过程

asp.net-identity - 如何从 ASP.NET Identity Core 2.0 中删除与角色相关的表

c# - 如何连接到 Azure Table/Cosmos 存储模拟器

c# - DateTime.TryParseExact 未按预期工作

c# - winform datagridview 在 CellValueChanged 期间更新值

c# - 用 C# 编写 XML

mysql - 带有 MySQL 数据库的 ASP.NET 5/MVC 6

c# - 如何使用 GetAsyncEnumerator 中止正在运行的 EF Core 查询?

asp.net-core - 删除 EF Core 中的相关数据

c# - EF Core 生成反向查询