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

标签 c# linq linq-to-sql linq-to-objects cartesian-product

我在这里看到了类似的问题,但无法弄清楚如何在笛卡尔积期望结果的情况下使用 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 再次采用这个和它的笛卡尔积。但是,只要我再添加一个不是引用对象而是引用 SQL 表的 from 子句,我就会收到一个错误。因此,将上面的内容更改为类似这样的内容,其中 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 并在连接数据库和本地序列时仍然产生笛卡尔积的任何想法?

最佳答案

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

关于c# - 如何在 linq 中获取数据库和本地序列之间的笛卡尔积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2837275/

相关文章:

c# - W8 Phone System.Xml.XmlException 与 XmlReader

c# - Linq C#-获取集合中的前一个元素

asp.net - 使用关系数据进行 LINQ 查询

asp.net-mvc - LINQ to SQL分页和COUNT(*)

c# 读取一个文本文件。如何避免重读

c# - Unity 使用按钮更改场景

c# where in with list 和 linq

c# - 是否可以选择一列的总和,按另一列分组?

c# - Entity Framework 日期组合查询

c# - 神经网络-反向传播,训练错误