Я использую 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, и он работает без нареканий!
Итак, следующий вопрос - ПОЧЕМУ он это делает? Это известная проблема?