Как и ИЛИ Или ISNull с использованием Linq для Entity Entity Framework4? Как ты это делаешь? - PullRequest
4 голосов
/ 30 ноября 2010

У меня есть экран в моем проекте «Запрос», где я могу выполнить 2 вида поиска. Я не могу понять, как сделать «нравится» или «И или ноль» в Linq для сущности.

  1. Простой поиск (Поиск по всем полям с помощью оператора «Мне нравится»)
  2. Расширенный расширенный поиск (Использование оператора «И»)

Итак, давайте возьмем эти 3 таблицы иПридумайте пример.

  1. Таблица клиентов (идентификатор клиента, имя, фамилия)
  2. Адрес (адрес, улица, город)
  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'))

Как вы делаете лайки и / или нулевые в структуре сущностей?

большое спасибо!

Ответы [ 2 ]

3 голосов
/ 30 ноября 2010

Для LIKE вы можете использовать Contains, StartsWith или EndsWith. Для 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 и посмотреть SQL, который генерирует EF (это хорошо для общего эксперимента LINQ и быстро опробовать простой код).

0 голосов
/ 30 ноября 2010
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...