使用Linq搜索列表

时间:2013-12-31 17:42:43

标签: c# sql .net asp.net-mvc-3 linq

是否可以使用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.

2 个答案:

答案 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