请教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里面,放到最后面
答
了解了,先从源头上去过滤。