LINQ连接/更新数据库中的对象列表

时间:2018-08-21 14:44:42

标签: c# linq join

对我来说,这是LINQ中的新问题。也许我正在解决这个错误。

我所拥有的是内存中的对象列表,最多可以有10万个对象,我需要在数据库中查找代表现有客户的对象。

此搜索需要跨多个对象属性进行,我所要做的只是该人的姓名和地址-没有唯一的标识符,因为此数据来自外部来源。

是否可以根据数据库上下文将对象的通用对象联接起来,然后根据上下文中的数据,使用上下文中的数据更新通用对象?

我认为我正在接近使用下面的代码进行联接。而且我认为该加入有效..也许。但是我什至似乎都无法遍历记录。

 default_charset = "UTF-8"

1 个答案:

答案 0 :(得分:0)

在我看来,您有两个集合:变量DocumentLineslines的本地集合,以及CustomerscustomerContext.Customers的集合,可能是数据库管理系统。

每个DocumentLine包含几个属性,这些属性也可以在Customer中找到。 las,您没有说是否可以在DocumentLine中找到所有Customer属性。

linesDocumentLines的本地集合)中,您只想保留DocumentLines中可查询的{ {1}}与所有这些属性匹配。

因此,结果是Customer的序列,是Customers的子集合。

问题是您不想查询数据库表DocumentLines的子集合,但是想要本地lines的子集合。

使用Customers不会将lines传输到DBMS。我怀疑您定义的查询是否将由DBMS执行。我怀疑所有AsQueryable都将被传输到您的本地进程以执行查询。

如果lines的所有属性都在Customers中,则可以从每个DocumentLine 提取 Customer属性并使用DocumentLines仅保留Customer中提取的Queryable.Contains

DocumentLines

注意:查询尚未执行!没有与DBMS通信

您请求的结果是lines中包含的所有customerDocumentLines,删除重复项。

IQueryable<DocumentLine> customerDocumentLines = dbContext.Customers
    .Select(customer => new DocumentLine()
    {
         FirstName = customer.FirstName,
         LastName = customer.LastName,
         ...
         // etc, fill all DocumentLine properties
    });

如果您无法从lines中提取完整的var result = customerDocumentLines // extract the document lines from all Customers .Distinct // remove duplicates .Where(line => lines.Contains(line)); // keep only those lines that are in lines ,则此方法将无效。如果DocumentLine包含重复项,则结果将不会显示这些重复项。

如果您无法从Customer中提取所有属性,则必须将这些值移至本地内存中进行检查:

lines

现在,您可以使用DocumentLine获取行的子集。您需要按价值而不是参考进行比较。幸运的是,匿名类型按值比较是否相等

var valuesToCompare = dbContext.Customers
    .Select(customer => new
    {
        FirstName = customer.FirstName,
        LastName = customer.LastName,
        ...
        // etc, fill all values you need to check
    })
    .Distinct()                // remove duplicates
    .AsEnumerable();           // make it IEnumerable,
                               // = efficiently move to local memory