LINQ

2016-10-07 16 views
1

dbContextLINQ

class Table1 

public string Id1 { get; set; } 
public string Field { get; set; } 
public string Id2 { get; set; } 
public virtual Table2 Table2 { get; set; } 

class Table2 

public string Id2 { get; set; } 
public string Field { get; set; } 

Table1Fieldが値の他のテーブルのリストにある場合、私はTable1からすべてのレコードを検索する必要があります。例えば

最初私は、この検索パラメータ

IQueryable<Table2> listOfvalues = from b in dbContext.Table2 
            where b.Field1.Contains(searchParam) 
            select b; 
result = listOfvalues.ToList(); 

そして今、私は、フィールドはそのlistOfValuesであるTable1からすべてのフィールドを返すコードを記述する必要がに一致するすべての値を選択します。

+2

あなたの質問は不明です..それを3回読んでもまだ分かりません。これを編集して、入力/出力のサンプルデータを追加してください –

+0

2つのテーブルを結合することはありますか?検索パラメータとしてTable2から値を取得し、Table2と結合して出力値を求めます。 – A3006

+0

Table1とTable2の間にjoinがあるので、Linqクエリの魔女を書く必要があります。そこにTable2のId2があります。Table2Fieldにはsearchparamが含まれています – Songaila

答えて

0

私は、あなたの特定のフィールドがすでに利用可能なリストの別のフィールドと一致するすべてのアイテムを探しているとします。あなたは何か似たようなことができる。あなたはあなただけのデータをロードする必要がナビゲーションプロパティを持っているとして使用してみてください

dbContext.Table1.Where(p => listOfvalues.Any(l => p.Field == l.Field)).ToList(); 

EDITは

var values = listOfvalues.Select (x => x.Field).ToList(); 
    dbContext.Table1.Where(p => values.Contains(p.Field)).ToList(); 
+0

私は幸運にも私のコードに入れていいです:( – Songaila

+0

var result = dbContext.Table1s.AsQuerable(); result = result.Where(t => t.Id2 ... – Songaila

+0

エラーが発生しました:作成できません – Songaila

2

が含まれています。

例えば

using(dbContext = dbContext.CreateContext()) 
{ 
    var foo = ...; 
    var results = dbContext.Table1Set.Where(t => t.table2.Field == foo); 
} 

あなたはコンテキスト内で残っているとして、あなたが原因仮想プロパティに遅延読み込みを使用することができます。 チェックを実行する際にコンテキストスコープ内にいない場合は、熱心な読み込みを使用する必要があります。

using(dbContext = dbContext.CreateContext()) 
{ 
    var setData = dbContext.Table1Set().Include(t => t.Table2); 
} 

var foo = ...; 
var results = setData.Where(t => t.Table2.Field = foo); 

あなたが別の方法で設定したデータをロードして、唯一のEnumerableコレクションを返す場合に便利です。

ロード関連企業の詳細については、このリンクが役立ちます:

https://msdn.microsoft.com/en-gb/data/jj574232.aspx

1
using(dbContext = dbContext.CreateContext()) 
{ 
    var setData = dbContext.Table1Set().Include(t => t.Table2); 
} 

これはあなたのケースのために動作します。

+0

とは何ですか?Table1Set? – Songaila

+0

Table1Setは、データベース内のテーブルの名前を示すテーブルです。 – OnurBulbul

+0

ありがとうございます...しかし、この場合私はDeadLockも持っています:(レコードの単純なリストを取得する方法を知らない... – Songaila

0

データ構造:

表1

class Journal 
int JournalId {get; set;} 
Date JournalDate {get; set;} 
string OwnerId {get; set;} 

表2

class Event 
string EventId {get; set;} 
string EventName {get; set;} 

は、私は簡単な解決策を見つけましたが、また別の問題を満たして...すべての

最初に私はそれを取得します値の一覧

var events = DBContext.Events.Where(o => o.EventName.Contains(searchParam)).AsQueryable(); 
var values = events.Select(x => x.EventID).ToList(); 

私は、クエリ結果をforeachサイクルでリストする方法しか知りません。私は今、リストを作成し、そこに値リスト内のイベントは、私が

JournalList = new List<Journal>(); 
foreach (string eventId in values) 
    { 
    var results = DBContext.Journals.Where(j => j.eventID.Equals(eventId)).ToList(); 
RegJournalList.AddRange(results); 
    } 

GroupedList = JournalList.Select(t => new JournalGrouped() 
        { 
         JournalID = t.JournalID, 
         JournalDate = t.JournalDate 
        }).Distinct().ToList(); 

を必要とするすべての値を置くしかし、私が優れているため、私は

var journals = DBContext.Journals.AsQuarable(); 

ないJournalListを持っている方が良いです。リスト内ではなくクエリのような一致するデータを取得する可能性はありますか?その後にフィルタリングする必要があるのですか?