使用Linq在表中搜索自定义类中的项目

时间:2017-12-07 00:34:02

标签: c# linq

我的代码可以正常工作,但是我试图找出如何优化它和/或通过将其更改为一行来加快速度,因为它目前每个循环执行一次数据库表查询,这似乎是永远拿下

自定义类和sql表都具有与您可以看到的完全相同的名称。 queryList是自定义类的列表。

foreach (var item in queryList)
{
    var query = context.DataTable.Where(i => i.ValueName == item.ValueName && i.Symbol == symbol && i.Days == item.Days).ToList();

    if (query.Count() > 0)
    {
         context.DataTable.RemoveRange(query);
    }
}

3 个答案:

答案 0 :(得分:2)

您可以在queryList

中测试Where的成员
var query = context.DataTable.Where(i => i.Symbol == symbol && queryList.Any(item => i.ValueName == item.ValueName && i.Days == item.Days)).ToList();

答案 1 :(得分:0)

如果您的queryList不是一个巨大的列表,这可能会有效:

我认为symbol应该是item.Symbol。如果是这种情况,请试试这个:

var items = queryList
    .Select(item => item.ValueName + "," + item.Symbol + "," + item.Days.ToString())
    .ToList();
var query = context.DataTable
    .Where(i => items.Contains(i.ValueName + "," + i.Symbol + "," + i.Days.ToString());

我们的想法是构建一个LINQ to SQL可以转换为WHERE x IN (str1, str2, str3)子句的字符串列表。

答案 2 :(得分:0)

您可以使用Union一次获取数据库中的所有数据:

var query = context.DataTable.Where(x => x.Id == 0);
foreach (var item in queryList)
    query = query.Union(context.DataTable.Where(i => i.ValueName == item.ValueName && i.Symbol == symbol && i.Days == item.Days));

var allData = query.ToList();
if (allData.Count() > 0)
    context.DataTable.RemoveRange(allData);