我喜欢动态地构建LINQ到实体查询。对于简单的简单过滤器,我会这样做:
var query = model.Pets;
if(searchForName)
query = query.Where(p => p.Name == "Bello");
if(searchForType)
query = query.Where(p => p.Type == 1);
var result = query.ToList();
现在,我想要为更复杂的查询构建这种类型的动态查询。
这是新的(样本)架构:
有没有办法生成一个结果查询来选择所有宠物,但只包含拥有某些属性的所有者?
结果应该是:
model.Pets.Include(p.Owner);
或
model.Pets.Include(p.Owner.Where(o => o.Name == "Hans"));
或
model.Pets.Include(p.Owner.Where(o => o.Gender == 0));
或
model.Pets.Include(p.Owner.Where(o => o.Name == "Hans").Where(o => o.Gender == 0));
我没有找到在查询中间注入Where子句的解决方案。 上面的示例已经过简化,我需要使用连接和子选择的更复杂的查询。
答案 0 :(得分:1)
也许您可以使用查询语法(在我看来,这更容易使用):
List<Pets> petsList = (from pet in model.Pets
join owner in model.Owner on pet.Owner_name equals owner.Name
where owner.Name.Equals("Hans") || owner.Name.Equals("James")
where pet.Type == 1
select pet).ToList();
希望这有帮助。
PS:对于主键,更喜欢整数而不是字符串。
答案 1 :(得分:1)
我建议您使用PredicateBuilder
请参阅网站http://www.albahari.com/nutshell/predicatebuilder.aspx
它可以更轻松地构建动态过滤器
你甚至可以使用方法
public static Expression<Func<Product, bool>> ContainsInDescription (
params string[] keywords)
{
var predicate = PredicateBuilder.False<Product>();
foreach (string keyword in keywords)
{
string temp = keyword;
predicate = predicate.Or (p => p.Description.Contains (temp));
}
return predicate;
var classics = Product.ContainsInDescription ("Nokia", "Ericsson")
.And (Product.IsSelling());