私は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 に @ 記号を手動で追加したところ、問題なく動作しました。
では、次の質問 - なぜこれを行っているのですか? これは既知の問題ですか?