1

私はVS2008を使用しており(現在VS2010のオプションはありません)、(逆の)Containsを実行して、部分的な文字列を文字列全体に一致させようとしています。たとえば、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 に @ 記号を手動で追加したところ、問題なく動作しました。

では、次の質問 - なぜこれを行っているのですか? これは既知の問題ですか?

4

3 に答える 3

0

あなたのコードに問題はありません。ただし、クエリの直後に配置しefMatchingUrlCompanyListないでください。代わりに、空のリストを含める必要があります。null変数にアクセスしたときに本当に見つかっnullた場合は、おそらく質問に含まれているコード以外にバグがあります。

于 2010-02-09T18:16:05.467 に答える
0

ステートメントはwheretrue を返しません。絶対。

于 2010-02-09T18:16:08.603 に答える
0

生成された SQL について誰も前に出ることができないため、最初のメモのように効率の悪いルートを使用することにしました。バマー本当に...

于 2010-02-16T19:59:23.917 に答える