【问题标题】:Like and And Or ISNull using Linq to Entity Entity Framework4? How do you do that?Like and And Or IS Null 使用 Linq to Entity Entity Framework 4?你是怎样做的?
【发布时间】:2010-11-30 06:03:58
【问题描述】:

我的项目“查询”中有一个屏幕,用户可以在其中执行 2 种搜索。我不知道如何在 Linq to entity 中执行“喜欢”或“And or is null”。

  1. 简单搜索(使用“Like”运算符搜索所有字段)
  2. 高级高级搜索(使用“与”运算符)

所以让我们拿这 3 张表做一个点头的例子。

  1. 客户表(客户 ID、姓名、姓氏)
  2. 地址(AddressID,Street,City)
  3. CustomerOrder (OrderID,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 =@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 and or is null怎么办?

非常感谢!

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    对于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)
    

    并产生这些结果:

    编辑

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

    【讨论】:

    • 非常感谢您的回复。设法使它几乎所有工作。我在用整数创建“喜欢”时遇到问题。我需要做类似“SqlFunctions.StringConvert((double )c.CustomerID)).Contains("12") 。但是 sql 输出与 c.CustomerID LIKE '%' + @SearchText + '%' 完全不同,我得到 WHERE (STR( CAST( [Extent2].[CustomerID] AS 浮动)) LIKE N'%1%')
    • @user231465,我刚刚尝试使用SqlFunctions.StringConvert,得到了正确的结果。在这种情况下,EF 生成的 sql 并不像您手动编写的那样简单。它转换为浮点数,然后使用STR 函数转换为字符串,然后进行LIKE 比较。出于某种原因,StringConvert 没有采用int 的重载,因此(double)c.CustomerID 是强制转换为float 的原因。另外,我假设.Contains("12") 在您的评论中导致LIKE N'%12%',而不是LIKE N'%1%
    • 是否有示例如何执行“AND OR SYNTAX”,例如“AND CA.City =@City or @City ISNULL”,谢谢
    • @user231465,您只需使用 C# 逻辑运算符 &&||。请参阅我的答案中的示例和 where 子句中生成的 sql。
    • @adrift。感谢您的回复。但我使用了逻辑运算符 And or 但 EF 没有产生我期望的语法“or @City is null”丢失.mmm
    【解决方案2】:
    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;
    

    【讨论】:

    • 嗨,谢谢您的回复。上面的查询似乎没有产生一个和或条件子句,例如“AND CA.City =@City or @City ISNULL”。任何想法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2017-05-29
    • 2019-03-15
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多