2010-11-30 106 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;