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

请教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();
    }
    

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?