所以我有一个难以置信的难题。基本上,我有一个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 +“ - ”+标题),然后将其发送给数据库,但这感觉有点草率,因为索引不能使用。
非常感谢任何帮助。
答案 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作为表值参数。您可以考虑按照建议使用连接方法。如果需要索引来获得可接受的性能,可以将复合键添加为持久计算列和索引。