对我来说,这是LINQ中的新问题。也许我正在解决这个错误。
我所拥有的是内存中的对象列表,最多可以有10万个对象,我需要在数据库中查找代表现有客户的对象。
此搜索需要跨多个对象属性进行,我所要做的只是该人的姓名和地址-没有唯一的标识符,因为此数据来自外部来源。
是否可以根据数据库上下文将对象的通用对象联接起来,然后根据上下文中的数据,使用上下文中的数据更新通用对象?
我认为我正在接近使用下面的代码进行联接。而且我认为该加入有效..也许。但是我什至似乎都无法遍历记录。
default_charset = "UTF-8"
答案 0 :(得分:0)
在我看来,您有两个集合:变量DocumentLines
中lines
的本地集合,以及Customers
中customerContext.Customers
的集合,可能是数据库管理系统。
每个DocumentLine
包含几个属性,这些属性也可以在Customer
中找到。 las,您没有说是否可以在DocumentLine
中找到所有Customer
属性。
在lines
(DocumentLines
的本地集合)中,您只想保留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