2

Linq クエリ内の文字列配列で Array.Contains を使用しようとしています。

var otherMatchingDevices = from d in selectedDevices
                           from c in mldb.Companies
                           where d.CompanyID == c.CompanyID && c.Deleted == 0
                           where searchTerms.Contains(d.Name.ToString(), StringComparer.CurrentCultureIgnoreCase) || searchTerms.Contains(c.CompanyName.ToString(), StringComparer.CurrentCultureIgnoreCase)
                           select d;

クエリが評価されると、「サポートされていないオーバーロードがクエリ演算子 'Contains' に使用されています。

StringComparer を使用してこのコードをテストしたところ、正常に動作し、「fOO」が出力されました。

string[] sList = { "fOO", "bar" };
string[] array = { "foo" };
List<string> stringlist = sList.ToList();
var qry = from s in stringlist
          where array.Contains(s, StringComparer.CurrentCultureIgnoreCase)
          select s;
if (qry.Count() > 0) Console.WriteLine(qry.First().ToString());

Linq クエリ内で大文字と小文字を区別しない Array.Contains を使用する方法を教えてもらえますか? 元の文字列 ToUpper() または ToLower() は高価であり、元のデータが変更されるため、変換したくありません。

4

2 に答える 2

2

StringComparer を使用してこのコードをテストしたところ、正常に動作し、「fOO」が出力されました。

LINQ to Objects は、LINQ to SQL/Entities とは異なります。後者はクエリを SQL 式に変換する必要があるため、何が何であるかを理解できませんStringComparsion

AsEnumerable()クエリで使用して、データをメモリ内に取り込むことができます。

var otherMatchingDevices = (from d in selectedDevices
                            from c in mldb.Companies
                            where d.CompanyID == c.CompanyID && c.Deleted == 0)
                            .AsEnumerable()
                            .Where(searchTerms.Contains(d.Name.ToString(), 
                                               StringComparer.CurrentCultureIgnoreCase) || 
                                   searchTerms.Contains(c.CompanyName.ToString(), 
                                               StringComparer.CurrentCultureIgnoreCase))
                            .ToArray()
于 2015-05-26T16:36:38.513 に答える