我的项目“查询”中有一个屏幕,我的用户可以执行2种搜索。我无法弄清楚如何在Linq中对实体执行“like”或“And或is null”。
所以,让我们看看这3张桌子并构成一个愚蠢的例子。
基本搜索: 这就是我在Sql中的表现方式
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 + '%') )
高级搜索
这是我的sql where子句
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 or和or?
非常感谢!
答案 0 :(得分:3)
对于LIKE
,您可以使用Contains
,StartsWith
或EndsWith
。对于IS 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)
并产生以下结果:
修改的
我使用LINQPad生成这些结果。这是一个很好的工具,可以免费使用(有购买Intellisense功能的选项),如果您想尝试不同的LINQ查询并查看EF正在生成的SQL(这对于一般的LINQ实验很有用),这绝对值得一看。并快速尝试简单的代码。)
答案 1 :(得分:0)
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;