c#, EF:创建Linq查询,比较两个属性

本文关键字:两个 属性 查询 EF 创建 Linq 比较 | 更新日期: 2023-09-27 18:14:03

所以我有一个难题,我不能想到我的出路。基本上,我有一个Book对象,它有两个属性:Title和ISBN。我想说的是,从这个Book列表中,在数据库中查找具有匹配组合的Book。

朴素代码看起来像这样:

foreach( var book in BookList )
{ 
   var matchingBook = 
        context.BookSet.Where( n => n.ISBN.Equals(book.ISBN ) 
           && n.Title.Equals(book.Title)).FirstOrDefault();
   if( matchingBook )
   ....
}

显然,这是一个次优解决方案,但我不知道如何解决这个问题,除了遍历书籍,创建一个复合键(ISBN +"-"+ Title),然后将其发送到DB,但这感觉有点草率,因为索引不能使用。

c#, EF:创建Linq查询,比较两个属性

使用join来获取匹配的数据

var matchingBook =from bkSet in context.BookSet join bkList in BookList on bkSet.Title equals bkList.Title 

由于您的需求是相等性检查,解决方案相当简单,您可以创建一个关键字列表来检查和查询,如

var keywords = bookList.Select(x => x.ISBN + x.Name);
var filteredBooks = context.Books.Where(x => keywords.Contains(x.ISBN + x.Name));
//other filters on filteredBooks if any goes here
var result= filteredBooks.ToList();

这将在sql中创建一个in子句,看起来类似于,

SELECT 
    [Extent1].[ISBN] AS [ISBN], 
    [Extent1].[Name] AS [Name]
    FROM [dbo].[Books] AS [Extent1]
    WHERE ([Extent1].[ISBN] + [Extent1].[Name] IN 
         (N'123-45Test 2', N'55656-78Test 3', 
          N'345345-67Test 4', N'5656-767Test 5')) 
    AND ([Extent1].[ISBN] + [Extent1].[Name] IS NOT NULL)

如果不使用表值函数,将输入的标题和isbn作为表值参数,我认为这是不可能的。您可以考虑使用您建议的串联方法。如果需要索引来获得可接受的性能,可以将组合键添加为持久化计算列,并在其上添加索引。