我正在使用 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 中手动添加了 @ 符号,它运行完美!
那么,下一个问题——为什么要这样做?这是一个已知的问题?