1

LINQ(C#)を使用して、一連のSQLLIKEステートメントでSQLINステートメントをエミュレートしようとしています。IQueryable<user>まだ「フィルタリング」されていないQueryという名前のオブジェクトから始めます。Stack Overflowに投稿し始めたばかりなので、しばらくお待ちください:) ...

ObjectQuery<user> Context = this.Context.users;
IQueryable<user> Query = (IQueryable<user>)Context;
// create a BLANK clone of the FULL list (Query)
var QueryFinal = Query.Where(i => i.ID == 0);
foreach (String Item in userFilter.Name.Contains)
{
    // based on the FULL list (Query) return all records that apply to this item & then append results to the final list
    QueryFinal = QueryFinal.Concat(Query.Where(i => i.Name.Contains(Item)));
}
return QueryFinal.ToList();

反復ごとに、Query.Whereステートメントで返される結果セットがQueryFinalリストに追加されると思いましたが、何らかの理由で、後続の反復ごとに、以前のすべてのレコードが上書きされているように見えます。最終的なリストに「安全に保管するために保存される」ことになっています。.Unionも試してみましたが、期待した結果にはなりませんでした。返されるように見えるのは最後の結果セットだけであり、追加された結果セットのすべてが一緒になっているわけではありません。誰かが私が間違っていることに気づきましたか?

4

2 に答える 2

1

実行が延期されるため、を呼び出すとQueryFinal.ToList();、最後の値が使用されます。Itemこれは、この種のクエリをforeachループで実行する場合の非常に一般的な問題です。

あなたの場合、このようなものが役立つかもしれません:

foreach (String Item in userFilter.Name.Contains) 
{ 
    string currentItem = Item;
    // based on the FULL list (Query) return all records that apply to this item & then append results to the final list 
    QueryFinal = QueryFinal.Concat(Query.Where(i => i.Name.Contains(currentItem))); 
} 
于 2012-10-22T01:36:08.047 に答える
0

これを試して:

var query = this.Context.users.Where(u => 
    userFilter.Name.Contains.Any(c => u.Name.Contains(c))
    );
于 2012-10-22T01:31:35.727 に答える