加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C#LINQ中构建高效的查询来过滤数据

发布时间:2020-12-16 06:51:41 所属栏目:百科 来源:网络整理
导读:我有一个集合列表 Person成员.我需要根据一些标准过滤列表. 请参考以下C#代码: void Main(){ ListPerson Members = new ListPerson() { new Person() { ID = 101,Name = "Harry",Department = "Testing",Gender = "Male",Role = "Manager"},new Person() {
我有一个集合列表< Person>成员.我需要根据一些标准过滤列表.

请参考以下C#代码:

void Main()
{
    List<Person> Members = new List<Person>()
    {
        new Person() { ID = 101,Name = "Harry",Department = "Testing",Gender = "Male",Role = "Manager"},new Person() { ID = 102,Name = "Peter",Department = "Development",new Person() { ID = 103,Name = "Emma Watson",Gender = "Female",Role = "Assistant"},new Person() { ID = 104,Name = "Raj",new Person() { ID = 105,Name = "Kaliya",};
}

模型类是:

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Department { get; set; }
    public string Gender { get; set; }
    public string Role { get; set; }
}

现在考虑一下情景

场景#1:使用ID搜索

List<KeyValuePair<string,string>> searchCriteria = new List<System.Collections.Generic.KeyValuePair<string,string>>()
    {
        new KeyValuePair<string,string>("ID","102")
    };

场景#2:使用ID&部门

List<KeyValuePair<string,"101"),new KeyValuePair<string,string>("DEP","Testing")
    };

场景#3:使用部门,性别和角色进行搜索

List<KeyValuePair<string,string>>()
{
    new KeyValuePair<string,"Development"),string>("Gender","Male"),string>("Role","Manager"),};

搜索查询应该是这样的

var iQuery = Members.AsQueryable();

foreach (var item in searchCriteria)
{
    switch (item.Key)
    {
        case "ID":
            iQuery = iQuery.Where(p => p.ID == int.Parse(item.Value));
            break;

        case "Name":
            iQuery = iQuery.Where(p => p.Name.Contains(item.Value));
            break;

        case "DEP":
            iQuery = iQuery.Where(p => p.Department == item.Value);
            break;

        case "Gender":
            iQuery = iQuery.Where(p => p.Gender == item.Value);
            break;

        case "Role":
            iQuery = iQuery.Where(p => p.Role == item.Value);
            break;
    }
}

在我的真实项目中,我在数据库中有超过1000K的记录.代替

var iQuery = Members.AsQueryable();

我正在使用

var iQuery = db.Members.AsQueryable();

查询数据需要20到25秒.请帮助我如何在C#LINQ中构建更有效的查询来过滤数据.

解决方法

这里的问题不在于LINQ实际在做什么.方案2的查询只会创建类似于:

SELECT * FROM
PERSON
WHERE Department = N'Development'
AND Gender = N'Male'
AND Role = N'Manager'

您需要直接对数据库运行此操作以确定您的性能瓶颈.您很可能缺少索引,因此强制数据库服务器扫描整个表以获取结果集.

如果您正在使用SQL Server,请尝试运行探查器以确定(假设)LINQ-to-EF正在生成并调整它的确切查询.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读