2012-02-23 16 views
3

私は年齢や時間のように数多くから多くの関係を持つモデルコースを持っています。類似の複数のlinqクエリ

私はこのクエリを持っている:

string IDs = "1,2,3" 
string[] IDList = IDs.Split(','); 

return (from x in entities.Course 
     where x.Ages.Where(val => IDList.Contains(val.ID.ToString())).Count() == IDList.Count() 
     select x); 

そして、私は時間とのように、いくつかの他の特性のために同じクエリを設定する必要があります。

string IDs = "1,2,3" 
string[] IDList = IDs.Split(','); 

return (from x in entities.Course 
     where x.Times.Where(val => IDList.Contains(val.ID.ToString())).Count() == IDList.Count() 
     select x); 

私は、クエリはよりダイナミックにするので、私はどうすればよいです複数の同様のクエリがありませんか?

おかげ

+1

ですか、それはエンティティへのLINQのですか?解決策は大きく異なる。 Linqについては、メソッドにリファクタを使用するだけです。 Linq to Entitiesソリューションはhttp://www.albahari.com/nutshell/linqkit.aspxにあります。 –

答えて

2

あなたは(あなたのデータ型にdepeneding)Expressionを受け入れる方法を作ることができるし、そのようにクエリを実行します。あなたも連鎖メソッド呼び出しとして2つのクエリフィルタを組み合わせることができます。 AgesTimeなどが動作するための特定のインターフェイスを実装する必要があります。例えば

、あなたがEFを使用していて、あなたのモデルは、コードファーストはDbSet Sを使用していると仮定して、あなたはこれを行うことができます:それはただのLINQ

public interface IObject 
{ 
    int ID { get; set; } 
} 

public class Age : IObject 
{ 
    public int ID { get; set; } 

    // The rest of the data 
} 

public class Time : IObject 
{ 
    public int ID { get; set; } 

    // The rest of the data 
} 

public class Course 
{ 
    public virtual ICollection<Age> Ages { get; set; } 
    public virtual ICollection<Time> Times { get; set; } 
} 

public class CourseContext : DbContext 
{ 
    public DbSet<Course> Course { get; set; } 
} 

public class Test 
{ 
    public IQueryable<Course> GetCourses(Expression<Func<Course, ICollection<IObject>>> exp) 
    { 
     var entities = new CourseContext(); 
     string IDs = "1,2,3"; 
     string[] IDList = IDs.Split(','); 

     var c = exp.Compile(); 

     return entities.Course.Where(x => c.Invoke(x).Count(val => IDList.Contains(val.ID.ToString())) == IDList.Count()); 
    } 

    public void TestMethod() 
    { 
     var times = GetCourses(c => (ICollection<IObject>)c.Times); 
     var ages = GetCourses(c => (ICollection<IObject>)c.Ages); 
    } 
} 
+0

それはそれをしました - ありがとう – user441365

+0

いいえprob:私は表現が大好き!彼らは私の好きなC#の側面の一つです –

1

私は別のクエリ結果を返すメソッドを作ると思います: - のみwhere句が異なる

public IQuerable<Course> GetAllCourses() { 
    return entities.Course; 
} 

public IQueryable<Course> ByAge(IQueryable<Course> source, IEnumerable<String> ages { 
    return from x in source 
      where x.Ages.Where(val => ages.Contains(val.ID.ToString())).Count() == IDList.Count() 
      select x; 
} 

public IQuerable<Course> ByTimes(IQueryable<Course> source, IEnumerable<String> times) { 
    return from x in source 
      where x.Ages.Where(val => IDList.Contains(val.ID.ToString())).Count() == IDList.Count() 
      select x; 
} 

理由は、この方法クエリのロジックをカプセル化することです。その後、任意のソースを渡すことができます。

var ids = new [] { "1", "2", "3" }; 
var coursesByAgeAndTime = ByTime(ByAge(GetAllCourses(), ids), ids); 
+0

同じですが、私は同じです。私は全体のクエリを1にカプセル化する方法があるかどうか疑問に思っていました。 – user441365

+0

@ user441365メソッドは 'where'ロジックをカプセル化します。 'from x'ソースと' select x'ステートメントは 'source.Where(...)'になっています。 – Yuck

関連する問題