喜欢和或者ISNull使用Linq实体实体Framework4?你是怎样做的?

时间:2010-11-30 06:03:58

标签: entity-framework

我的项目“查询”中有一个屏幕,我的用户可以执行2种搜索。我无法弄清楚如何在Linq中对实体执行“like”或“And或is null”。

  1. 简单搜索(使用“赞”运算符在所有字段中搜索)
  2. 高级高级搜索(使用“与”操作员)
  3. 所以,让我们看看这3张桌子并构成一个愚蠢的例子。

    1. 客户表(CustomerID,姓名,姓氏)
    2. 地址(AddressID,街道,城市)
    3. CustomerOrder(OrderID,OrderName)
    4. 基本搜索: 这就是我在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?

      非常感谢!

2 个答案:

答案 0 :(得分: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实验很有用),这绝对值得一看。并快速尝试简单的代码。)

答案 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;