C # - Entity Framework - Делает обратное СОДЕРЖИТ? - PullRequest
1 голос
/ 09 февраля 2010

Я использую VS2008 (сейчас нет опции для VS2010) и делаю (реверс) Содержит, чтобы попытаться сопоставить частичную строку с целой строкой. Например, urlRef = http://www2.rivworks.com/feed-test-1/?SSScrollPosition=0 и defaultUrlDomain = www2.rivworks.com.

IList<vwCompanyDetails> efMatchingUrlCompanyList = null;
...
efMatchingUrlCompanyList = _dbRiv.vwCompanyDetails
                                 .Where(a => urlRef.Contains(a.defaultURLDomain) 
                                          && a.isCompanyDeleted == false)
                                 .ToList();
bool foundCompanyUrl = (efMatchingUrlCompanyList.Count > 0);

Глядя на мою базу данных, я должен получить 3 записи из этого запроса. Вместо этого я получаю ноль записей в efMatchingUrlCompanyList. (Изм)

Есть идеи или мне нужно будет получить все данные о компании, а затем выполнить ручную проверку каждой записи в цикле?


Примечание:

Я добавил дополнительный способ сделать это, и это работает.

var efMatchingUrlCompanyList2 = _dbRiv.vwCompanyDetails.Where(a => a.ClientID != null && a.ClientID > 0 && a.defaultURLDomain != null).ToList();
foreach (vwCompanyDetails myDetail in efMatchingUrlCompanyList2)
{
    if (urlRef.ToLower().Contains(myDetail.defaultURLDomain.ToLower()))
    {
        efMatchingUrlCompanyList.Add(myDetail);
    }
}
foundCompanyUrl = (efMatchingUrlCompanyList.Count > 0);

Я добавил предложение WHERE, чтобы сократить набор записей до того, что, как я знал, будет действительным. Я продолжу играть с оригиналом, чтобы посмотреть, смогу ли я заставить его работать как положено.


ПРИМЕЧАНИЕ 2: Я скачал и использую LINQPad. Я подключился к своей модели EF и создал этот небольшой фрагмент кода:

void Main()
{
    IList<vwCompanyDetails> efMatchingUrlCompanyList = null;
    string urlRef = "http://www2.rivworks.com";
    efMatchingUrlCompanyList = vwCompanyDetails.Where(a => urlRef.Contains(a.defaultURLDomain) && a.isCompanyDeleted == false).ToList();
}

Я посмотрел на сгенерированный SQL и вот что он сгенерировал (для краткости я вырезал 90% столбцов):

-- Region Parameters
DECLARE p__linq__1 NVarChar(17) SET p__linq__1 = 'http://www2.rivworks.com'
-- EndRegion
SELECT 
[Extent1].[CompanyId] AS [CompanyId], 
[Extent1].[CompanyName] AS [CompanyName], 
[Extent1].[isCompanyDeleted] AS [isCompanyDeleted], 
[Extent1].[ClientID] AS [ClientID], 
[Extent1].[defaultURLDomain] AS [defaultURLDomain], 
FROM (SELECT 
      [vwCompanyDetails].[CompanyId] AS [CompanyId], 
      [vwCompanyDetails].[CompanyName] AS [CompanyName], 
      [vwCompanyDetails].[isCompanyDeleted] AS [isCompanyDeleted], 
      [vwCompanyDetails].[ClientID] AS [ClientID], 
      [vwCompanyDetails].[defaultURLDomain] AS [defaultURLDomain], 
      FROM [dbo].[vwCompanyDetails] AS [vwCompanyDetails]) AS [Extent1]
WHERE ((CAST(CHARINDEX([Extent1].[defaultURLDomain], @p__linq__1) AS int)) > 0) 
AND (0 = [Extent1].[isCompanyDeleted])

Я скопировал / вставил это в SQL Mangler и попытался запустить. Я получил ошибку. Я посмотрел на определение снова и низко и вот - переменная p__linq__1 НЕ имеет символ @. Вместо этого он пытается рассматривать его как курсор! Я вручную добавил символ @ в SQL Mangler, и он работает без нареканий!

Итак, следующий вопрос - ПОЧЕМУ он это делает? Это известная проблема?

Ответы [ 3 ]

0 голосов
/ 09 февраля 2010

Оператор where не возвращает true. Совершенно верно.

0 голосов
/ 16 февраля 2010

Поскольку никто не может высказаться о сгенерированном SQL, я решил использовать менее эффективный маршрут, как в моей первой заметке. Облом действительно ...

0 голосов
/ 09 февраля 2010

Я не вижу проблем с вашим кодом. Но efMatchingUrlCompanyList никогда не должно быть null непосредственно после запроса - вместо этого он должен содержать пустой список. Если вы действительно обнаружите null при обращении к переменной, возможно, у вас есть ошибка вне кода, включенного в вопрос.

...