linq2sql и локальные последовательности
От: Angler Россия  
Дата: 29.12.10 12:20
Оценка:
Всем привет,


есть табличка "Table", содержащая поля [a1, a2, a3], по которым построен индекс. необходимо реализовать метод для выборки записей из данной таблички по указанным полям:
IEnumerable<Table> FindRecords(DataContext dc, IEnumerable<Key> keys);

где Key — дополнительная вспомогательная структура:
class Key
{
  public a1 {get;}
  public a2 {get;}
  public a3 {get;}
}

получается что-то вроде:

IEnumerable<Table> FindRecords(DataContext dc, IEnumerable<Key> keys)
{
   var q = from t in dataContext.Table
           from key in keys
           where t.a1 == key.a1 && t.a2 == key.a2 && t.a3 == key.t3
           select t;
   return q;
}


Это компилируется, однако при обращении в самим данным вылетает эксепшин:

An unhandled exception of type 'System.NotSupportedException' occurred in System.Data.Linq.dll
Additional information: Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.


ОК подсунул ему Contains
IEnumerable<Table> FindRecords(DataContext dc, IEnumerable<Key> keys)
{
   var q = from t in dataContext.Table
           from key in keys
           where keys.Contains(makeKey(t.a1, t.a2, t.a3))
           select t;
   return q;
}


Cообщение об ошибке не изменилось...
Подскажите, существует ли возможность реализовать метод FindRecords с указанной выше сигнатурой, учитывая что таблица содержит большое количество данных, тоесть необходимо заставить использоваться индекс для [a1, a2, a3]?
Пока вижу только два варианта, но оба "левые":
1. заполнять временную табличку с ключами и её джоинить c "Table"
2. выбирать построчно, тоесть что-то вроде:

IEnumerable<Table> FindRecords(DataContext dc, IEnumerable<Key> keys)
{
   return keys
      .SelectMany(key => dataContext.Table.Where(t => t.a1 == key.a1 && t.a2 == key.a2 && t.a3 == key.t3));
}




Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.