代码之家  ›  专栏  ›  技术社区  ›  J.D.

如何在LINQ中得到数据库和局部序列之间的笛卡尔积?

  •  4
  • J.D.  · 技术社区  · 16 年前

    我在这里看到了类似的问题,但无法理解如何在笛卡尔产品中使用contains所需的结果情况:

    LINQ To SQL exception: Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains operator

    假设我有以下几点:

    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,  
    

    现在,我真正想要的是将它和笛卡尔积,再和我所拥有的数据库表中的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);
    

    这个 错误 我得到以下信息:

    在查询运算符的Linq to SQL实现中不能使用本地序列,但包含运算符除外

    显然,这与不使用contains有关,但我不确定当我真的不想压缩结果时,如何使用contains-我想要笛卡尔积作为我的情况。在连接数据库和本地序列时,关于如何使用contains的任何想法都会产生笛卡尔积?

    1 回复  |  直到 16 年前
        1
  •  6
  •   Mark Byers    16 年前

    你可以使用 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),
            };