2016-10-07 1 views
1

DbContextLINQ выбрать из таблицы, где fieldValue находится в другом списке таблицы значений

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; } 

мне нужно искать все записи из Table1 где Table1Field находится в другом списке таблицы значений.

Например первый я выбираю все значения, которые соответствуют этому параметру Поиск

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

А теперь мне нужно написать код, который возвращает все поля из Table1, где поле в этом listOfValues.

+2

Ваш вопрос непонятен. Прочтите его 3 раза и все еще не уверены. Пожалуйста, отредактируйте его, чтобы сделать его понятным, и, пожалуйста, добавьте пример данных ввода/вывода –

+0

Это о соединении двух таблиц? Получение некоторых значений из таблицы 2 для параметров поиска, а затем из таблицы 1, которая объединяется с таблицей 2 для выходных значений? – A3006

+0

Существует соединение между Table1 и Table2, поэтому мне нужно написать запрос Linq witch, который возвращает всю таблицу 1, там записывается Id2 в таблице2, где Table2.Field содержит 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

У меня ошибка: не удалось создать постоянное значение типа «dbContext.xxxx». В этом контексте поддерживаются только примитивные типы или типы перечислений. – 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

Таблица1Настроенная таблица, которая указывает имя таблицы в вашей базе данных. – OnurBulbul

+0

большое спасибо ... но в этом случае я также получил DeadLock :(не знаю, как получить простой список записей ... – Songaila

0

Структура данных:

Table1

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

Table2

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. Есть ли какие-либо возможности для получения совпадающих данных не в списке, а как с запросом, потому что мне нужно отфильтровать его после этого?