Entity framework Like and或ISNull使用Linq到实体框架4?你是怎么做到的?
在我的项目“查询”中有一个屏幕,我的用户可以在其中执行两种搜索。我不知道如何在Linq to实体中执行“like”或“And或is null”Entity framework Like and或ISNull使用Linq到实体框架4?你是怎么做到的?,entity-framework,Entity Framework,在我的项目“查询”中有一个屏幕,我的用户可以在其中执行两种搜索。我不知道如何在Linq to实体中执行“like”或“And或is null” 简单搜索(使用“Like”运算符在所有字段中搜索) 高级搜索(使用“和”运算符) 让我们拿这3张表来做一个简单的例子 客户表(客户ID、姓名、姓氏) 地址(地址ID、街道、城市) CustomerOrder(OrderID、OrderName) 基本搜索: 这就是我在Sql中的实现方式 SELECT TOP (100) C.Name,C.Surnam
SELECT TOP (100) C.Name,C.Surname,CA.Street,CA.City,CO.OrderName
FROM Customer C
LEFT JOIN CustomerAddress CA ON C.CustomerID=CA.CustomerID
LEFT JOIN CustomerOrders CO ON C.CustomerID=CA.CustomerID
WHERE (C.CustomerID LIKE '%' + @SearchText + '%'
OR C.Surname LIKE '%' + @SearchText + '%'
OR C.Name LIKE '%' + @SearchText + '%'
OR CA.Street LIKE '%' + @SearchText + '%'
OR CA.City LIKE '%' + @SearchText + '%'
OR CO.OrderName LIKE '%' + @SearchText + '%') )
高级搜索
这是mysqlwhere子句
WHERE (C.CustomerID =@CustomerID or @CustomerID ISNULL
AND C.Surname =@Surname or @Surname ISNULL
AND C.Name=@Name or @Name ISNULL
AND CA.Street =@Street or @Street ISNULL
AND CA.City =@City or @City ISNULL
AND CO.OrderName =@OrderName or @OrderName ISNULL)
AND ((ModifiedDate BETWEEN ISNULL(convert(varchar,@FromDate,101),'01/01/1901')
AND ISNULL(convert(varchar,@ToDate,101),'12/31/9999'))
您如何在实体框架中使用Likes或is null
非常感谢 对于类似于的
,您可以使用包含
,开始时使用
,或结束时使用
。对于为NULL
,请使用==NULL
例如:
var list = from p in Products
where (p.Description.Contains("v") && p.Description.StartsWith("C"))
|| p.MFRCode == "TOYOTA"
|| p.Universal == null
select p;
将导致EF生成以下SQL:
SELECT
[Extent1].[MFRCode] AS [MFRCode],
[Extent1].[MFRProductID] AS [MFRProductID],
[Extent1].[Universal] AS [Universal],
[Extent1].[Description] AS [Description]
FROM [dbo].[Products] AS [Extent1]
WHERE (([Extent1].[Description] LIKE N'%v%') AND ([Extent1].[Description] LIKE N'C%')) OR (N'TOYOTA' = [Extent1].[MFRCode]) OR ([Extent1].[Universal] IS NULL)
并产生这些结果:
编辑
我曾经产生过这些结果。这是一个很好的工具,可以免费使用(可以选择购买Intellisense功能),如果您想尝试不同的LINQ查询并查看EF生成的SQL,那么它绝对值得一看(这对于一般LINQ实验和快速尝试简单代码都很好).非常感谢您的回复。我几乎成功了。我在使用整数创建“Like”时遇到了问题。我是否需要执行类似“SqlFunctions.StringConvert((double)c.CustomerID)).Contains(“12”)。但sql输出与c.CustomerID完全不同,比如“%+@SearchText+%”我在哪里得到(STR(CAST([Extent2])。[CustomerID]作为浮点数(如N“%1%”)@用户231465,我刚刚尝试使用SqlFunctions.StringConvert
,我得到了正确的结果。在这种情况下,EF生成的sql并不像手动编写代码那样简单。它先使用STR
函数转换为float,然后使用STR
函数转换为字符串,然后执行类似于的比较操作。由于某种原因,EF没有重载rStringConvert
接受一个int
,因此(双)c.CustomerID
是转换为float
的原因。另外,我假设.Contains(“12”)
在您的注释中导致类似于N'%12%
,而不是类似于N'%1%
。是否有示例如何执行”和/或语法“eg”和CA.City=@City或@City为空" thanks@user231465,您只需使用C#逻辑运算符、&&
和|
。请参阅我答案中的示例以及where子句中生成的sql。@adrift。谢谢你的回复。但是我已经使用了And或的逻辑运算符,但是EF没有生成我所期望的“or@City is null”的语法。mmmhi,谢谢你的回复。上面的查询似乎没有生成And或条件子句,例如“And.CA.City=@City或@City ISNULL”。有什么想法吗
int? customerID = null;
string surname = "abc";
var q = from c in oc.Customers
where (customerID == null || c.CustomerID == customerID)
&& (surname == null || c.Surname == surname)
select c;