我正在使用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变量 DOES NOT 有一个@符号。它试图将其视为光标而不是!我手动在SQL Mangler中添加了@符号,它运行得很完美!
那么,下一个问题 - 为什么要这样做?这是一个已知的问题吗?
答案 0 :(得分:0)
我看到您的代码没有问题。但是efMatchingUrlCompanyList
在查询后不应该直接null
- 而是应该包含一个空列表。如果您在访问变量时确实找到了null
,那么您可能在问题中包含的代码之外有一个错误。
答案 1 :(得分:0)
where
语句不会返回true。绝对
答案 2 :(得分:0)
由于没有人可以提出生成的SQL,我选择使用效率较低的路由,就像我的第一个注释一样。真糟糕的......