Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework Like and或ISNull使用Linq到实体框架4?你是怎么做到的?_Entity Framework - Fatal编程技术网

Entity framework Like and或ISNull使用Linq到实体框架4?你是怎么做到的?

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

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

  • 简单搜索(使用“Like”运算符在所有字段中搜索)
  • 高级搜索(使用“和”运算符)
  • 让我们拿这3张表来做一个简单的例子

  • 客户表(客户ID、姓名、姓氏)
  • 地址(地址ID、街道、城市)
  • 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 + '%') )
    
    高级搜索

    这是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没有重载r
    StringConvert
    接受一个
    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;