2010-11-30 109 views
4

我在我的项目“查询”中有一个屏幕,我用户可以执行2种搜索。我无法弄清楚如何在实体中执行“like”或“And or null”。Like和And或者ISNull使用Linq to Entity Entity Framework4?你是怎样做的?

  1. 简单搜索
  2. 高级高级搜索(使用“和”运算符)(使用“赞”运营商在各个领域搜索)

所以,让我们把这些3个表和补诺迪例子。

  1. 客户表(客户ID,姓名,姓)
  2. 地址(AddressID,街,市)
  3. CustomerOrder(订单ID,ORDERNAME)

基本搜索: 这是我会怎样这样做在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 [email protected] or @CustomerID ISNULL 
    AND C.Surname [email protected] or @Surname ISNULL 
    AND [email protected] or @Name ISNULL   
    AND CA.Street [email protected] or @Street ISNULL 
    AND CA.City [email protected] or @City ISNULL 
    AND CO.OrderName [email protected] or @OrderName ISNULL) 
    AND ((ModifiedDate BETWEEN ISNULL(convert(varchar,@FromDate,101),'01/01/1901') 
    AND ISNULL(convert(varchar,@ToDate,101),'12/31/9999')) 

你怎么做喜欢或和或为空在实体框架?

非常感谢!

回答

3

对于LIKE,您可以使用ContainsStartsWithEndsWith。对于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) 

和产生这些结果:

alt text

编辑

我用LINQPad来产生这些结果。这是一个非常棒的工具,可以免费使用(有购买Intellisense功能的选项),如果您想试验不同的LINQ查询并查看EF正在生成的SQL,那么绝对值得一看(这对于一般的LINQ实验很有用并快速尝试简单的代码)。

+0

非常感谢您的reply.Managed使它几乎所有的干活。有一个问题在创造一个“赞”与integer.Do我需要做一些事情,如“SqlFunctions.StringConvert((双)C .CustomerID))。Contains(“12”)。但是sql输出与c.CustomerID LIKE'%'+ @SearchText +'%'没什么两样。 ))LIKE N'%1%') – user9969 2010-11-30 16:49:09

+0

@ user231465,我刚刚尝试过使用`SqlFunctions.StringConvert`,并且得到了正确的结果。在这种情况下EF生成的sql并不像手动编写代码那么简单。它使用`STR`函数将其转换为浮点数,然后进行串处理,然后进行`LIKE`比较。出于某种原因,对于使用`int`的`StringConvert`没有重载,所以`(double)c.CustomerID`是转换为`float`的原因。另外,我假设`.Contains(“12”)`在你的评论中产生了`LIKE N'%12%``,而不是'LIKE N'%1%``。 – 2010-11-30 23:57:17

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;