linq中的动态子查询

时间:2015-12-28 09:31:27

标签: c# entity-framework linq-to-entities

我喜欢动态地构建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();

现在,我想要为更复杂的查询构建这种类型的动态查询。

这是新的(样本)架构:

enter image description here

有没有办法生成一个结果查询来选择所有宠物,但只包含拥有某些属性的所有者?

结果应该是:

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子句的解决方案。 上面的示例已经过简化,我需要使用连接和子选择的更复杂的查询。

2 个答案:

答案 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());