2

おそらくばかげた答えの質問ですが、IQueryableを定義し、後で別のコンテキストで再利用する方法はありますか?

(擬似コード)のように考えてください:

public IQueryable<myItem> MyQuery()
{
   using(MyContext context = new MyContext())
   {
        return (from myItem in context.MyItems
                select ...);
   }
}

これは、以下のように「何らかの」方法で使用されます。

public void MyMethod()
{
    using(MyContext context = new MyContext())
    {
        context.ExecuteQueryUnderContext(MyQuery());
    }

    using(MyContext context2 = new MyContext())
    {
        context2.ExecuteQueryUnderContext(MyQuery());
    }
}

ありがとう

4

5 に答える 5

3

不明な既存のクエリの関数としてクエリを定義できます。

// You can add any paramaters you want to this method
// You can also turn this into an extension method
public Func<IQueryable<TItem>, IQueryable<TItem>> MyQuery()
{
   return (IQueryable<TItem> items) => (items.Select...);
}

次に、次のように使用します。

using (var context = new MyContext())
{
    return MyQuery(context.Items).ToList();
}

またはこのように:

using (var context = new MyContext())
{
    return MyQuery(context.Items.Where(item.Size > 3)).FirstOrDefault();
}

このようにして、クエリを再利用したり、連鎖させたりすることもできます。

または、次のようにします。

public Item GetItem(Func<IQueryable<TItem>, IQueryable<TItem>> query)
{
    using (var context = new MyContext())
    {
        return query(context.Items).SingleOrDefault();
    }
}
于 2012-07-03T16:01:41.440 に答える
2
public static class Extension
    {
        public static IQueryable<MyItem> MyQuery(this IQueryable<MyItem> items, int someId)
        {
            return items.Where(x => x.ID == someId);
        }
    }

それを使用して:

using(MyContext context = new MyContext())
{
       var item = context.MyItems.MyQuery(5);
}
于 2012-07-03T15:57:57.040 に答える
1

コンパイルされたクエリを使用できます。

public static readonly Func<MyContext, IQueryable<MyItem>> dbGetMyItems =
CompiledQuery.Compile<MyContext, IQueryable<MyItem>>
(context) => from myItem in context.MyItems
                select ...);

そしてそれを次のように呼び出します。

public void MyMethod()
{
    using(MyContext context = new MyContext())
    {
      var query = dbGetMyItems(context);
    }
}

これにより、キャッシュされたクエリ プランの利点も得られるため、パフォーマンスが向上します。

于 2012-07-03T16:00:04.123 に答える
0

Queryメソッドのパラメーターとしてコンテキストを渡します

public IQueryable<myItem> MyQuery(MyContext context)
{

        return (from myItem in context.MyItems
                select ...);
}

public void MyMethod()
{
    using(MyContext context = new MyContext())
    {
      var query = MyQuery(context);
    }
}
于 2012-07-03T15:52:12.213 に答える