3

2 つのエンティティがあるとします。

public class Animal {
  public int ID { get; set; }
  public string Name { get; set; }
  public bool EatsVegetables { get; set; }
  public bool EatsMeat { get; get; }
  public bool EatsFruits { get; set; }
}

public bool Food {
  public int ID { get; set; }
  public string Name { get; set; }
  public bool ContainsVegetables { get; set; }
  public bool ContainsMeat { get; get; }
  public bool ContainsFruits { get; set; }
}

(動物は、食べられないものを含まないものなら何でも食べることができると考えます。) 特定の食べ物が与えられたので、どの動物にそれを食べさせることができるかを調べたいと思います。特定の動物が与えられた場合、その動物に何を食べさせることができるかを調べたいと思います。

public static Expression<Func<Animal, IEnumerable<Food>>> GetAllowedFoods(MyDataContext db) {
  return a => db.Foods.Where(f => 
    (a.EatsVegetables || !f.ContainsVegetables)
    && (a.EatsMeat || !f.ContainsMeat)
    && (a.EatsFruits || !f.ContainsFruits));
}

逆の式は驚くほど似ています。

public static Expression<Func<Food, IEnumerable<Animal>>> GetAllowedAnimals(MyDataContext db) {
  return f => db.Animals.Where(a => 
    (a.EatsVegetables || !f.ContainsVegetables)
    && (a.EatsMeat || !f.ContainsMeat)
    && (a.EatsFruits || !f.ContainsFruits));
}

したがって、本当に意味のあるのは、結合された式です。

public static Expression<Func<Animal, Food, bool>> IsAllowedDiet() {
  return (a, f) => 
    (a.EatsVegetables || !f.ContainsVegetables)
    && (a.EatsMeat || !f.ContainsMeat)
    && (a.EatsFruits || !f.ContainsFruits));
}

そして、どういうわけか上記の 2 つのメソッドは、式を呼び出す必要がありGetAllowedFoodsます。 GetAllowedAnimalsIsAllowedDiet

これは、LinqKitが簡単に実行できるはずのことだと思いますが、LinqKit の初心者として、正しい構文がどうなるかわかりません!

4

1 に答える 1

0

私はそれを解決しました。メソッドIsAllowedDiet()は、質問で表現されたままです。 GetAllowedFoods()となり、GetAllowedAnimals()次のように表されます。

public static Expression<Func<Animal, IEnumerable<Food>>> GetAllowedFoods(MyDataContext db) {
  var isAllowed = IsAllowedDiet();
  return a => db.Foods.AsExpandable().Where(f => isAllowed.Invoke(a, f));
}

public static Expression<Func<Food, IEnumerable<Animal>>> GetAllowedAnimals(MyDataContext db) {
  var isAllowed = IsAllowedDiet();
  return f => db.Animals.AsExpandable().Where(a => isAllowed.Invoke(a, f));
}

LinqKit を楽しみ始めています。:-)

于 2013-06-02T13:28:36.193 に答える