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

请教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用表达式树)

 if (!string.IsNullOrEmpty(personName))
{
    people =  people.Where(w=>w.Name==personName).ToList();
}

if (!string.IsNullOrEmpty(petName))
{
    people =  people.Where(w=>w.Name==petName).ToList();
}

 

第二个w.Name改成PetName

第二个弄错了

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

 

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

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