5

3 行 (現在のレコード、前のレコード、および現在のレコードに関連する次のレコード) を返す LINQ クエリを実行する必要があります。ProductID は、自動生成された ID 列です。

現在、これを Union LINQ ステートメントで行っていますが、同じタスクを達成するためのより良い方法またはより効率的な方法があるかどうかはわかりません。

これが私が得たものです:

var ProductID = 10;

var Results = (from p in DB.Products
where p.ProductID == ProductID - 1 //Previous record.
select new Product
{
    ProductID = p.ProductID,
    ProductTitle = p.ProductTitle,
    Views = p.Views,
}).Union(from p in DB.Products
where p.ProductID == ProductID //Current record
select new Product
{
    ProductID = p.ProductID,
    ProductTitle = p.ProductTitle,
    Views = p.Views,
}).Union(from p in DB.Products
where p.ProductID == ProductID + 1 //Next record.
select new Product
{
    ProductID = p.ProductID,
    ProductTitle = p.ProductTitle,
    Views = p.Views,
});

これにより、ProductID 9、ProductID 10、ProductID 11 の 3 行が返されます。

4

5 に答える 5

6

個人的には、このアプローチを使用します。範囲内で Id が欠落している場合に機能するという利点があります。勇敢な人は、すべての Id が説明され、存在していると想定します。

 var currAndNext = Context.Set<TPoco>()
                  .Where<TPoco>(t=>t.id == id)
                  .OrderBy(t=>t.id)
                  .Skip(0)
                  .Take(2);
 var prev = Context.Set<TPoco>()
                  .Where<TPoco>(t=>t.id == id)
                  .OrderByDescending(t=>t.id)
                  .Skip(1)
                  .Take(1);
于 2013-08-04T23:56:36.960 に答える
3

あなたのアプローチは、次のようにもっと短く書き直すことができます。

var ProductID = 10;

var Results = (from p in DB.Products
where p.ProductID >= ProductID - 1 &&
      p.ProductID <= ProductID + 1
select new Product
{
   ProductID = p.ProductID,
   ProductTitle = p.ProductTitle,
   Views = p.Views,
});

ただし、指定された productID に対応するレコードが Products テーブルから削除されていない場合にのみ、必要なものが返されることに注意してください。

于 2013-08-04T23:48:33.187 に答える
1

GwynBleidd は適切な解決策を提案しましたが、次のように ID のリストを指定することもできます。

var ids = new[] {ProductID - 1, ProcuctID, ProductID + 1};

そしてそれをwhere句で使用します

var Results = from p in DB.Products
              where ids.Contains(p.ProductID)
              select new Product
              {
                 ProductID = p.ProductID,
                 ProductTitle = p.ProductTitle,
                 Views = p.Views,
              };

これはより汎用性が高く、EF はそれを に変換すると思います。これはWHERE [ProductID] IN (...)、クエリ実行プランナーが非常にうまく処理できます。

于 2013-08-04T23:56:44.117 に答える