2017-08-07 8 views
0

私は検索したい値のデータベースを持っています。c#エンティティフレームワークエンティティへのlinqを持つオブジェクトへのlinqの混合

何かを検索するには、ユーザーがメモリ内のリストに含まれる特定のチェックボックスを選択する必要があります(チェックボックスの値を変更すると、データベースの保存になります。

私のデータベースからのデータは

.LOAD()

方法によってロードされています。

私の問題は、データベースの値をメモリのtrue/false値と混在させたクエリを構築する方法です。

var query1 = from i in db.MyValuesTable 
       from j in MyMemoryObjects 
       where j.IsTrue && j.Id == i.Tab2Id && i.Value.Contains(_searchPhrase) 
       select i; 

(from i in db.TableToLoad 
from j in query1 
where i.CollectionWithValues.Any(x => x.Tab1Id == j.Tab1Id && x.Tab2Id == j.Tab2Id).select i).Load(); 

私のクエリは少し混乱することができ、私は一般的にサポートされていないオブジェクトへのLINQを持つエンティティにLINQをミキシング

//db object 
public class MyValuesTable 
{ 
    public int Tab1Id { get; set; } 
    public int Tab2Id { get; set; } 
    public string Value { get; set; } 
} 

//memory object 
public class MyMemoryObjects 
{ 
    public int Id { get; set; } 
    public bool IsTrue { get; set; } 
} 

//db object 
public class TableToLoad 
{ 
    public int Tab1Id { get; set; } 
    public int Tab2Id { get; set; } 
    public string Value { get; set; } 
} 
+0

あなた質問は明確ではない。理解しやすいようにしてください。 –

+0

正しい結果を返すオブジェクトに対して、linqとエンティティをlinqとlinqを混合したクエリを作成したい(query2がメッセージで例外をスローしない場合に返されるはずのもの: "プリミティブ型または列挙型のみの定数値を作成できないこの文脈では ") – d3st1ny

答えて

2

(EFコードファースト)の下に、データベースのスキーマを入れます。実際には、唯一サポートされている構造体はメモリプリミティブ型IEnumerable<T>に適用されたContainsメソッドです。これはSQL IN (value1, value2, ...)句に変換されます。 j.IsTrue && j.Id == i.Tab2Id基準が、その後Contains基準としてエンティティクエリにLINQの内部で使用することができ、適用j.IsTrueフィルタでj.Idのメモリリストにに変換することができますので、

は幸いにも、それはあなたのシナリオに適用されるのです:

// has to be variable outside of the L2E query 
var idFilter = from j in MyMemoryObjects 
       where j.IsTrue 
       select j.Id; 

var query1 = from i in db.MyValuesTable 
      where idFilter.Contains(i.Tab2Id) // <-- and use it inside 
       && i.Value.Contains(_searchPhrase) 
      select i; 

// ... 
関連する問題