如何在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正在生成并调整它的确切查询. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |