1

私はそれを単一のクエリで書く必要があります。パラメータに応じて、regionidは、パラメータがゼロより大きい場合、regionidが条件のいずれかを保持する必要があります。このパラメータがリクエストに含まれている場合、含まれていない場合。

 var myRegionId = 0;
                if (!string.IsNullOrEmpty(regionId))
                {
                    myRegionId = int.Parse(regionId);
                }

                IOrderedQueryable price;
                if (myRegionId>0)
                {
                     price = (from p in _db.PRICEs
                                  join good in _db.GOODs on p.good_id equals good.id
                                  join gname in _db.spr_goods_names on good.goods_name_id equals gname.id
                                  where ******p.region_id == myRegionId &&** gname.name.ToLower().Contains(filterText.ToLower())****
                                  group p by new{ p.good_id} into g
                                  select new
                                  {
                                      GoodId = g.Key.good_id,
                                      Promotion = g.Count(x => x.promotion != ""),
                                      MinPrice = g.Min(x => x.good_price),
                                      DistributorCount = g.Count(x => x.distributor_id != null)
                                  }
                            ).OrderByDescending(x => x.DistributorCount).Take(100).OrderBy(x => x.MinPrice);
                }else
                {
                    price = (from p in _db.PRICEs
                             join good in _db.GOODs on p.good_id equals good.id
                             join gname in _db.spr_goods_names on good.goods_name_id equals gname.id
                             **where gname.name.ToLower().Contains(filterText.ToLower())**
                             group p by new { p.good_id } into g
                             select new
                             {
                                 GoodId = g.Key.good_id,
                                 Promotion = g.Count(x => x.promotion != ""),
                                 MinPrice = g.Min(x => x.good_price),
                                 DistributorCount = g.Count(x => x.distributor_id != null)
                             }
                           ).OrderByDescending(x => x.DistributorCount).Take(100).OrderBy(x => x.MinPrice);
                }
4

3 に答える 3

1

これはどう?

 price = (from p in _db.PRICEs
          join good in _db.GOODs on p.good_id equals good.id
          join gname in _db.spr_goods_names on good.goods_name_id equals gname.id
          where (myRegionId <= 0 || p.region_id == myRegionId) && gname.name.ToLower().Contains(filterText.ToLower())
          group p by new{ p.good_id} into g
          select new
          {
              GoodId = g.Key.good_id,
              Promotion = g.Count(x => x.promotion != ""),
              MinPrice = g.Min(x => x.good_price),
              DistributorCount = g.Count(x => x.distributor_id != null)
          }).OrderByDescending(x => x.DistributorCount).Take(100).OrderBy(x => x.MinPrice);

の場合myRegionId <= 0、評価され、評価されtrueないp.region_id == myRegionIdため、無視されます。

于 2012-06-05T12:12:56.873 に答える
1

遅延読み込み機能を使用します。データが必要ない限り、クエリの作成を操作できます。

var a = from p in _db.PRICEs
...

if (condition) a = a.where...
else a=a.where...

if (condition2) a = a.where...

var b = from a ....

foreachを繰り返すか、ToListを呼び出すと、データがダウンロードされ、クエリがdbに送信されます。したがって、約束する前に、必要なことを行うことができます。

PS:パフォーマンスを最適化するために、プロファイラーを使用してBDに送信されるクエリを確認します。時々、ORMは非常に巨大なものを構築し、パフォーマンスを損なう可能性があります。

于 2012-06-05T12:25:41.350 に答える
1

次のように、部分に分割することもできます。

var query = from p in _db.PRICEs        
            join good in _db.GOODs on p.good_id equals good.id                                    
            join gname in _db.spr_goods_names on good.goods_name_id equals gname.id
            where gname.name.ToLower().Contains(filterText.ToLower())
            select p;

if (myRegionId>0)
{
   query = query.Where(p => p.region_id == myRegionId);
}

var price = from p in query
            group p by new{ p.good_id} into g
            select new
            {
               GoodId = g.Key.good_id,
               Promotion = g.Count(x => x.promotion != ""),
               MinPrice = g.Min(x => x.good_price),
               DistributorCount = g.Count(x => x.distributor_id != null)
            }).OrderByDescending(x => x.DistributorCount).Take(100).OrderBy(x => x.MinPrice);
于 2012-06-05T12:34:44.160 に答える