如何在linq中获取数据库和本地序列之间的笛卡尔积?

J.D*_*.D. 4 c# linq linq-to-objects cartesian-product linq-to-sql

我在这里看到了类似的问题,但无法弄清楚如何在Cartesian产品中使用Contains所需的结果情况:

LINQ To SQL异常:除Contains运算符外,本地序列不能用于查询运算符的LINQ to SQL实现

假设我有以下内容:

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);
Run Code Online (Sandbox Code Playgroud)

这很好用,我得到这样的转储(注意,我想要笛卡尔积):

01a02b, 01a05b, 01a08b, 04a02b, 04a05b, 04a08b, 07a02b, 07a05b, 07a08b,  
Run Code Online (Sandbox Code Playgroud)

现在,我真正想要的是将这个和笛卡尔产品再次对照我的数据库表中的ID.但是,只要我再添加一个from子句而不是引用对象,引用SQL表,我就会收到错误.因此,将上面的内容改为类似的地方,其中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);
Run Code Online (Sandbox Code Playgroud)

我得到的错误如下:

除Contains运算符外,本地序列不能用于查询运算符的LINQ to SQL实现

它与显然没有使用Contains有关,但我不确定如果我不想收缩包含将如何使用 - 我想要笛卡尔产品用于我的情况.在加入数据库和本地序列时,有关如何使用包含上述内容并仍然产生笛卡尔积的任何想法?

Mar*_*ers 6

你可以使用ToListAsEnumerable:

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),
        };
Run Code Online (Sandbox Code Playgroud)

  • 或.AsEnumerable() (3认同)