Метод LINQ с несколькими условиями и комбинациями - PullRequest
0 голосов
/ 10 октября 2018

Допустим, у меня есть класс List of Detail с 1000 записями.Как я могу точно получить совпадающие данные из таблицы данных базы данных, используя метод LINQ с сочетанием свойств FirstCode и SecondCode?

public class Detail
{
  public string FirstCode  { get; set; }
  public string SecondCode { get; set; }
}

Если мы собираемся извлечь отдельные данные, это будет выглядеть так:

foreach(var detail in details)
{
    var retrievedData = context.Details
        .Where(x => x.FirstCode == detail.FirstCode && x.SecondCode == detail.SecondCode)
        .FirstOrDefault();

    // Add to some list here
}

Но я не хочу получать 1000 раз из базы данных, а также я не хочу получать все данные из таблицы сведений, а затем выполнять поиск на уровне .NET, потому что этоне идеально, если у нас есть куча данных (например, более 500 000 записей в таблице сведений).

1 Ответ

0 голосов
/ 11 октября 2018

Вам необходимо программно сгенерировать предложение 'where'.Начните с запроса, который возвращает все строки в таблице базы данных Details ...

IQueryable<XDetail> queryable = (from d in context.Details select d);

... где XDetail - тип класса таблицы базы данных.Я предполагаю, что он отличается от класса Detail в вашем вопросе.Теперь вам нужно сгенерировать все пункты запроса, которые задают список записей, которые мы хотим ...

var predicate = PredicateBuilder.False<XDetail>();
foreach(Detail d in details)
    predicate = predicate.Or((xd) => xd.FirstCode == d.FirstCode && 
                                     xd.SecondCode == d.SecondCode));

queryable = queryable.Where(predicate);
var results = queryable.ToList();

Вы можете увидеть код для класса PredicateBuilder здесь .Обратите внимание, что Entity Framework сгенерирует необходимый SQL, но есть предел тому, насколько большим может быть этот запрос.Таким образом, добавление 1000 предложений, безусловно, сделает его большим.Вам придется экспериментировать, но вы можете ограничиться 100 или менее, прежде чем достигнете предела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...