qq_22863999 2020-11-17 09:28 采纳率: 100%
浏览 198
已采纳

请教Linq关于一个多集合join,然后动态where条件的问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Dynamic.Core;

namespace ConsoleApp1
{
    //主人类
    internal class Person
    {
        public string Name { get; set; }
    }

    //宠物类
    internal class Pet
    {
        public string PetName { get; set; }
        public string OwnerName { get; set; }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            var people = new List<Person>
            {
                new Person{Name="yangis"},
                new Person{Name="moll"},
                new Person{Name="daixu"},
            };

            var pets = new List<Pet>
            {
                new Pet{PetName="chicken",OwnerName="yangis"},
                new Pet{PetName="cow",OwnerName="moll"},
                new Pet{PetName="bull",OwnerName="daixu"},
                new Pet{PetName="pig",OwnerName="daixu"},
            };

            //查询条件
            var personName = "daixu";
            var petName = "pig";

            StringBuilder builder = new StringBuilder();
            builder.Append("1 = 1");

            //参数
            var sqlParams = new List<object>();

            if (!string.IsNullOrEmpty(personName))
            {
                builder.Append($" and Name == @{sqlParams.Count}");
                sqlParams.Add(personName);
            }
            if (!string.IsNullOrEmpty(petName))
            {
                builder.Append($" and PetName == @{sqlParams.Count}");
                sqlParams.Add(petName);
            }

            var query = (from person in people
                         join pet in pets on person.Name equals pet.OwnerName
                         select new { person.Name, pet.PetName }).AsQueryable().Where(builder.ToString(), sqlParams.ToArray());

            foreach (var item in query)
            {
                Console.WriteLine($"{item.Name} - {item.PetName}");
            }

            Console.ReadKey();
        }
    }
}

我这样写是不是相当于把所有记录查出来,再过滤了?

如果是,请问有什么好的方法吗?

(PS:我不太xi'guan用表达式树)

  • 写回答

5条回答 默认 最新

  • 浅析丶 2020-11-17 16:31
    关注
     if (!string.IsNullOrEmpty(personName))
    {
        people =  people.Where(w=>w.Name==personName).ToList();
    }
    
    if (!string.IsNullOrEmpty(petName))
    {
        people =  people.Where(w=>w.Name==petName).ToList();
    }
    

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 浅析丶 2020-11-17 16:32
    关注

    第二个w.Name改成PetName

    评论
  • 浅析丶 2020-11-17 16:36
    关注

    第二个弄错了

    f (!string.IsNullOrEmpty(petName))
    {
        pets=  pets.Where(w=>w.PetName==petName).ToList();
    }

     

    评论
  • 椎名小由奈 2020-11-17 17:28
    关注

    .ToList()不要放到If里面,放到最后面

    评论
  • qq_22863999 2020-11-18 15:54
    关注

    了解了,先从源头上去过滤。

    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥100 正常上网,内部网页无法打开
  • ¥15 组件库引入并使用在若依框架未展示
  • ¥149 关于#使用python 的Flash Echarts+ajax+mysql动态数据实现饼图#的问题,请各位专家解答!
  • ¥15 RichTextBox中追加文本时报错
  • ¥15 关于c语言的学习问题
  • ¥15 activity升级到flowable工作流act_ge_bytearray的草稿json数据复制到act_de_model 的model_editor_json的脚本
  • ¥15 cvi使用CreateThread创建线程时,出现存储空间不足无法处理此命令的错误
  • ¥15 求苹果推信imessage批量推信技术
  • ¥15 ubuntu 22.04 系统盘空间不足。隐藏的docker空间占用?(相关搜索:移动硬盘|管理系统)
  • ¥15 c++ word自动化,为什么可用接口是空的?