Linq to sql LINQ2SQL动态查询

Linq to sql LINQ2SQL动态查询,linq-to-sql,Linq To Sql,是否有任何方法可以重构此代码,以便在传入函数的值为null时省略不必要的where和join(如果传入了所有参数,此代码现在就可以正常工作)?“SearchItems”和“ItemDistance”函数是表级函数,分别用于执行全文搜索和距离计算 public IQueryable<ItemSearchResult> Search(string keywords, int? category, float? latitude, float? longitude) { retur

是否有任何方法可以重构此代码,以便在传入函数的值为null时省略不必要的where和join(如果传入了所有参数,此代码现在就可以正常工作)?“SearchItems”和“ItemDistance”函数是表级函数,分别用于执行全文搜索和距离计算

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
                      };
}
公共IQueryable搜索(字符串关键字、整数类别、浮点纬度、浮点经度)
{
从_db.Items中的项返回
在_db.searchItems中加入searchItems(关键字)
on item.ItemId等于searchItems.ItemId
在_db.itemdestance(latitude.Value,longitude.Value)中连接itemdestance
在item.ItemId上等于itemDistance.ItemId
其中item.Category==Category.Value
选择新的ItemSearchResult()
{
项目=项目,
距离=项目距离。距离
};
}

对于初学者,传入该函数的唯一可以为null的值是
关键字
,因为所有其他值都是不可为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
                  };

对于初学者来说,传入该函数的唯一可以为null的值是
关键字
,因为所有其他值都是不可为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
                  };

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

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();
}
公共IQueryable搜索(字符串关键字、整数类别、浮点纬度、浮点经度)
{
IEnumerable结果=null;
var query=_db.Items.AsEnumerable();
if(category.HasValue)
{
query=query.Where(i=>i.Category==Category.Value);
}
如果(!string.IsNullOrEmpty(关键字))
{
query=query.Where(i=>\u db.SearchItems(关键字)
.Any(s=>s.ItemId==i.ItemId));
}
if(latitude.HasValue&&longitude.HasValue)
{
结果=来自查询中的项
以_db.ItemDistance(纬度值、经度值)表示的连接距离
在item.ItemId上等于distance.ItemId
选择新项目搜索结果
{
项目=项目,
距离=距离
};
}
其他的
{
result=query.Select(i=>newitemsearchresult{Item=i});
}
返回结果!=null
?result.AsQueryable()
:新建列表().AsQueryable();
}

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

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();
}
公共IQueryable搜索(字符串关键字、整数类别、浮点纬度、浮点经度)
{
IEnumerable结果=null;
var query=_db.Items.AsEnumerable();
if(category.HasValue)
{
query=query.Where(i=>i.Category==Category.Value);
}
如果(!string.IsNullOrEmpty(关键字))
{
query=query.Where(i=>\u db.SearchItems(关键字)
.Any(s=>s.ItemId==i.ItemId));
}
if(latitude.HasValue&&longitude.HasValue)
{
结果=来自查询中的项
以_db.ItemDistance(纬度值、经度值)表示的连接距离
在item.ItemId上等于distance.ItemId
选择新项目搜索结果
{
项目=项目,
距离=距离
};
}
其他的
{
result=query.Select(i=>newitemsearchresult{Item=i});
}
返回结果!=null
?result.AsQueryable()
:新建列表().AsQueryable();
}

将问题更新为可空参数将问题更新为可空参数