2016-04-04 18 views
3

私は3つのプロパティを持つタプルのリストを持っているとしましょう。今私のデータベースでは、私はタプルと一致するかもしれない3つのフィールドを持っているテーブルがあります。どのように地球上で私はEFC#、EF:タプルのリストを使用してテーブルから選択

"どこo.Prop1 = tuple.Item1 & & o.Prop2 = tuple.Item2 & & o.Prop3 = tuple.Item3 oをOtherTableから選択" を教えてください。

タプルが1つの場合、これを行う方法は非常によくわかりますが、タプルのリストがある場合はどのようにすればいいのかわからず、OtherTableの一致するすべてのレコードが返されます。私が1つのプロパティで一致していた場合は、 "Where ListOfIds.Contains(id)..."のような処理を行い、その後は複数のプロパティを持つようになります。

+0

タプルリストにはいくつのアイテムがありますか?それが多くない場合は、すぐに長い「OR」クエリを生成することができます。多くの場合、それらを一時変数にドロップします。テーブルを作成し、 'IN'クエリを使用してください – Carsten

+0

@Carsten私のリストには何百ものタプルがあります。私はまだ周りを見ている。私はある種のSProcを使用する必要があるように見えます。 –

+0

何百ものものはそれほど多くありません - 正直言って私は大規模な場所を使ってみようとしています - これがうまくいかない場合、または遅くなる場合は2番目のものを試してください – Carsten

答えて

1

何エンティティのSQLクエリについてのダイナミックで「どこ」状態?

var list = new List<Tuple<string, int, bool>>(); 
    list.Add(new Tuple<string, int, bool>("1", 2, true)); 
    list.Add(new Tuple<string, int, bool>("2", 4, true)); 
    list.Add(new Tuple<string, int, bool>("3", 5, false)); 

    var query = list.Select(x => x.GetType().GetProperties().Select((y, index) => string.Concat("o.Prop", index + 1, "=", y.GetValue(x))).Aggregate((a, b) => a + " and " + b)) 
        .Aggregate((a, b) => string.Format("({0}) or ({1})", a, b)); 

    var result = context.OtherTable.SqlQuery("Select * from OtherTable o where " + query).ToList(); 

OR はそれだけであなたのo.Propのすべての場合に動作します、と述べwonderbellとしてあなたは(Containsその方法を使用することができますNには文字列型がありますが、 n別のタイプを文字列にキャストするにはSqlFunctions.StringConvertのようなものを使用してください):

var queryList = list.Select(x => x.GetType().GetProperties().ToList().OrderBy(x => x.Name).Select(y => y.GetValue(x).ToString()) 
        .Aggregate((a, b) => a + "," + b)); 
    var result = context.OtherTable.Where(x => queryList.Contains(x.Prop1 + "," + x.Prop2 + "," + x.Prop3)) 
        .ToList(); 
関連する問題