代码之家  ›  专栏  ›  技术社区  ›  Kevin Pang

Linq 2 Sql动态查询

  •  0
  • Kevin Pang  · 技术社区  · 17 年前

    public IQueryable<ItemSearchResult> Search(string keywords, int? category, float? latitude, float? longitude)
    {
        return from item in _db.Items
               join searchItems in _db.SearchItems(keywords)
                   on item.ItemId equals searchItems.ItemId
               join itemDistance in _db.ItemDistance(latitude.Value, longitude.Value)
                   on item.ItemId equals itemDistance.ItemId
               where item.Category == category.Value
               select new ItemSearchResult()
                          {
                              Item = item,
                              Distance = itemDistance.Distance
                          };
    }
    
    2 回复  |  直到 17 年前
        1
  •  2
  •   tvanfosson    17 年前

    我假设如果没有提供纬度或经度,则不计算距离(我可能会将两者封装到一个类中并传递它,而不是单独传递以避免混淆)。如果未提供其中之一,则搜索结果将使用默认距离。

    public IQueryable<ItemSearchResult> Search(string keywords, int? category, float? latitude, float? longitude)
    {
        IEnumerable<ItemSearchResult> result = null;
        var query = _db.Items.AsEnumerable();
        if (category.HasValue)
        {
            query = query.Where( i => i.Category == category.Value );
        }
        if (!string.IsNullOrEmpty(keywords))
        {
            query = query.Where( i => _db.SearchItems(keywords)
                                         .Any( s => s.ItemId == i.ItemId ));
        }
        if (latitude.HasValue && longitude.HasValue)
        {
            result = from item in query
                     join distance in _db.ItemDistance( latitude.Value, longitude.Value )
                         on item.ItemId equals distance.ItemId
                     select new ItemSearchResult
                            {
                                Item = item,
                                Distance = distance.Distance
                            };
        }
        else
        {
             result = query.Select( i => new ItemSearchResult { Item = i } );
        }
    
        return result != null
                  ? result.AsQueryable()
                  : new List<ItemSearchResult>().AsQueryable();
    }
    
        2
  •  1
  •   Pavel Minaev    17 年前

    对于初学者来说,传递给该函数的唯一可以为null的值是 keywords ,因为所有其他值类型都是不可为null的值类型。所以我只考虑这一点(如果你需要,其他人也可以得到类似的待遇)。

    首先不要使用连接:

    return from item in _db.Items
           where keywords == null || _db.SearchItems(keywords).Select(si => si.ItemId).Contains(item.ItemId) &&
           ...      
           where item.Category == category
           select new ItemSearchResult()
                      {
                          Item = item,
                          Distance = itemDistance.Distance
                      };