как получить декартовы произведения между базой данных и локальными последовательностями в linq? - PullRequest
4 голосов
/ 15 мая 2010

Я видел этот подобный вопрос здесь, но не могу понять, как использовать Содержит в декартовом продукте желаемую ситуацию результата:

Исключение LINQ To SQL: локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains

Допустим, у меня есть следующее:

var a = new [] { 1, 4, 7 };
var b = new [] { 2, 5, 8 };

var test = 
        from i in a
        from j in b
        select new {
            A = i,
            B = j,
            AB = string.Format("{0:00}a{1:00}b", i, j),
        };

foreach (var t in test)
    Console.Write("{0}, ", t.AB);

Это прекрасно работает, и я получаю дамп примерно так (обратите внимание, я хочу декартово произведение):

01a02b, 01a05b, 01a08b, 04a02b, 04a05b, 04a08b, 07a02b, 07a05b, 07a08b,  

Теперь я действительно хочу взять это и декартово произведение снова против идентификатора из таблицы базы данных, которую я имею. Но, как только я добавляю еще одно предложение from, которое вместо ссылки на объекты ссылается на таблицу SQL, я получаю error . Итак, изменив выше что-то подобное, где db определяется как новый DataContext (то есть класс, производный от System.Data.Linq.DataContext):

var a = new [] { 1, 4, 7 };
var b = new [] { 2, 5, 8 };

var test = 
        from symbol in db.Symbols
        from i in a
        from j in b
        select new {
            A = i,
            B = j,
            AB = string.Format("{0}{1:00}a{2:00}b", symbol.ID, i, j),
        };

foreach (var t in test)
    Console.Write("{0}, ", t.AB);

Ошибка Я получаю следующее:

Локальная последовательность не может использоваться в реализациях операторов запросов LINQ to SQL, кроме оператора Contains

Очевидно, это связано с неиспользованием Contains, но я не уверен, как будет использоваться Contains, когда я действительно не хочу ограничивать результаты - я хочу использовать декартово произведение для моей ситуации. Любые идеи о том, как использовать Содержит выше и все же дают декартово произведение при объединении базы данных и локальных последовательностей?

1 Ответ

6 голосов
/ 15 мая 2010

Вы можете использовать ToList или AsEnumerable:

var test = 
        from symbol in db.Symbols.AsEnumerable()
        from i in a
        from j in b
        select new {
            A = i,
            B = j,
            AB = string.Format("{0}{1:00}a{2:00}b", symbol.ID, i, j),
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...