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

时间:2016-10-21 04:44:27

标签: c# entity-framework linq

所以我有一个难以置信的难题。基本上,我有一个Book对象,它有两个属性,Title和ISBN。我想说的是,从这个书籍列表中,检查数据库中是否有匹配组合的书。

天真的代码看起来像这样:

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 +“ - ”+标题),然后将其发送给数据库,但这感觉有点草率,因为索引不能使用。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

只需使用join来获取匹配数据

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

答案 1 :(得分:0)

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

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)

答案 2 :(得分:0)

我不相信这是可能的,如果不采用表值函数,将输入标题和ISBN作为表值参数。您可以考虑按照建议使用连接方法。如果需要索引来获得可接受的性能,可以将复合键添加为持久计算列和索引。