C# - 实体框架 - 执行反向CONTAINS?

时间:2010-02-09 18:09:46

标签: c# .net linq contains

我正在使用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中添加了@符号,它运行得很完美!

那么,下一个问题 - 为什么要这样做?这是一个已知的问题吗?

3 个答案:

答案 0 :(得分:0)

我看到您的代码没有问题。但是efMatchingUrlCompanyList在查询后不应该直接null - 而是应该包含一个空列表。如果您在访问变量时确实找到了null,那么您可能在问题中包含的代码之外有一个错误。

答案 1 :(得分:0)

where语句不会返回true。绝对

答案 2 :(得分:0)

由于没有人可以提出生成的SQL,我选择使用效率较低的路由,就像我的第一个注释一样。真糟糕的......