qq_22863999
2020-11-17 09:28
采纳率: 50%
浏览 132

请教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

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

    打赏 评论

相关推荐 更多相似问题