是否可以使用Linq查询来搜索List
?在我的网络应用程序中,我必须根据用户上传的电子表格处理超过14k的记录。处理完每条记录后,我需要将该记录与我们目前在数据库中的记录进行比较,以确保我们要么不添加副本,要么知道我需要更新/编辑哪条记录。
我希望将此表中包含的所有记录拉入List
,然后根据一组条件执行搜索,而不是将数据库命中14k次或更多次。
这是我目前拥有的Linq查询命中数据库。业务规则非常复杂,所以我不会打扰你的细节,但这些是我需要满足搜索条件的条件。我已经测试了这个查询,它返回了预期的结果。
var previousZips = (from z in db.ZipCodeTerritory
where (item.ZipCode.Equals(null) ?
z.StateCode.Equals(item.StateCode) &&
z.ChannelCode.Equals(item.ChannelCode) &&
SqlFunctions.DateDiff("DAY", z.EndDate, item.EndDate) == 0 :
z.StateCode.Equals(item.StateCode) &&
z.ChannelCode.Equals(item.ChannelCode) &&
SqlFunctions.DateDiff("DAY", z.EndDate, item.EndDate) == 0 &&
(z.ZipCode.Equals(null) || z.ZipCode.Equals(item.ZipCode)))
select z).ToList();
然而,我想要做的是在表格中创建所有记录的List
,如下所示:
List<ZipCodeTerritory> allRecords = (from z in db.ZipCodeTerritory
select z).ToList()
然后使用类似于此的查询来从列表中提取我正在寻找的记录:
List<ZipCodeTerritory> previousZips = allRecords.Where(
z => (item.ZipCode.Equals(null)
? z.StateCode.Equals(item.StateCode) &&
z.ChannelCode.Equals(item.ChannelCode) &&
SqlFunctions.DateDiff("DAY", z.EndDate,
item.EndDate) == 0
: z.StateCode.Equals(item.StateCode) &&
z.ChannelCode.Equals(item.ChannelCode) &&
SqlFunctions.DateDiff("DAY", z.EndDate,item.EndDate) == 0 &&
(z.ZipCode.Equals(null) || z.ZipCode.Equals(item.ZipCode))
)
).ToList();
然而,上面的查询(来自List
)会引发以下错误:
This function can only be invoked from LINQ to Entities.
答案 0 :(得分:1)
回答了我自己的问题。这里的问题是SqlFunction
。通过从查询中删除它并像这样重写它可以正常工作
List<ZipCodeTerritory> previousZips = allRecords.Where(
z => (item.ZipCode.Equals(null)
? z.StateCode.Equals(item.StateCode) &&
z.ChannelCode.Equals(item.ChannelCode) &&
z.EndDate.Date == item.EndDate.Date
: z.StateCode.Equals(item.StateCode) &&
z.ChannelCode.Equals(item.ChannelCode) &&
z.EndDate.Date == item.EndDate.Date &&
(z.ZipCode.Equals(null) || z.ZipCode.Equals(item.ZipCode))
)
).ToList();
答案 1 :(得分:0)
而不是
SqlFunctions.DateDiff("DAY", z.EndDate,item.EndDate) == 0
使用
z.EndDate.Subtract(item.EndDate).TotalDays == 0