C# 应用位置过滤器的最佳实践

C# 应用位置过滤器的最佳实践,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我想有一个更干净的代码,使过滤器的初始值集 这段代码正在工作,但非常难看,问题是我找不到一种方法为类似于keywordsAddressIds.Where(splitKeywords.Contains(ks.Name))的splitKeywords.Contains(ks.Name)创建linq表达式: var addressPTQuery=\u addressPTRepository.Query; var categoryQuery=\u categoryRepository.Query; va

我想有一个更干净的代码,使过滤器的初始值集

这段代码正在工作,但非常难看,问题是我找不到一种方法为类似于
keywordsAddressIds.Where(splitKeywords.Contains(ks.Name))的
splitKeywords.Contains(ks.Name)
创建linq表达式:

var addressPTQuery=\u addressPTRepository.Query;
var categoryQuery=\u categoryRepository.Query;
var keywordSearchQuery=\u keywordSearchRepository.Query;
//关键字saddressions的初始值//
var keywordsAddressIds=来自keywordSearchQuery中的ks,其中splitKeywords.Contains(ks.Name)选择ks.Keyword.Addresses.select(k=>k.Id);
var searchResults=new CategoryGetAllBySearchListDto();
如果(iUserCenter)
{
//过滤到关键字saddressions//
DbGeography centerPoint=Map.CreatePoint(userLng,userLat);
//半径以公里为单位,所以我们必须乘以100才能得到米
ks.Keyword.Addresses.Select(ad=>ad.Id)==addressPTQuery.Where(p=>p.Location.Distance(centerPoint)adPT.Id));
KeywordsAdpressDS=来自keywordSearchQuery中的ks
其中splitKeywords.Contains(ks.Name)
选择ks.Keyword.Addresses.Where(p=>p.Location.Distance(centerPoint)a.Id);
}
如果(!string.IsNullOrEmpty(位置))为else
{
//过滤到关键字saddressions//
字符串位置标准=清洁位置(位置);
addressPTQuery=addressPTQuery.Where(p=>p.PTCouncil.NameStandard==locationStandard);
KeywordsAdpressDS=来自keywordSearchQuery中的ks
其中splitKeywords.Contains(ks.Name)
选择ks.Keyword.Addresses.select(a=>a.Id).Intersect(addressPTQuery.select(ad=>ad.Id));
}

那么为什么不获取所有地址ID,然后像这样选择所需的地址

var addressPTQuery = _addressPTRepository.Query;
var categoryQuery = _categoryRepository.Query; 
var keywordSearchQuery = _keywordSearchRepository.Query;

// Initial value of keywordsAddresses //
var keywordsAddresses = from ks in keywordSearchQuery 
                        where splitKeywords.Contains(ks.Name) 
                        select ks.Keyword.Addresses;

var searchResults = new CategoryGetAllBySearchListDto();

if (isUserCenter)
{
    // Filter to keywordsAddressIds  //

    DbGeography centerPoint = Map.CreatePoint(userLng, userLat);

    // radius is in kms so we have to x 100 to get meters
    ks.Keyword.Addresses.Select(ad => ad.Id) == addressPTQuery.Where(p => p.Location.Distance(centerPoint) < radius * 1000).Select(adPT => adPT.Id));

    keywordsAddressIds = from p in keywordsAddresses 
                         where p.Location.Distance(centerPoint) < radius * 1000
                         select p.Id;
}
else if (!string.IsNullOrEmpty(location))
{
    // Filter to keywordsAddressIds  //

    string locationStandard = CleanLocation(location);

    addressPTQuery = addressPTQuery.Where(p => p.PTCouncil.NameStandard == locationStandard);

    keywordsAddressIds = from a in keywordsAddresses
                         join b in addressPTQuery on a.Id equals b.Id
                         select a.Id;
}
var addressPTQuery=\u addressPTRepository.Query;
var categoryQuery=\u categoryRepository.Query;
var keywordSearchQuery=\u keywordSearchRepository.Query;
//关键字saddress的初始值//
var keywordsaddress=来自关键字搜索查询中的ks
其中splitKeywords.Contains(ks.Name)
选择ks.Keyword.Addresses;
var searchResults=new CategoryGetAllBySearchListDto();
如果(iUserCenter)
{
//过滤到关键字saddressions//
DbGeography centerPoint=Map.CreatePoint(userLng,userLat);
//半径以公里为单位,所以我们必须乘以100才能得到米
ks.Keyword.Addresses.Select(ad=>ad.Id)==addressPTQuery.Where(p=>p.Location.Distance(centerPoint)adPT.Id));
关键字saddresses=来自关键字saddresses中的p
其中p.位置距离(中心点)<半径*1000
选择p.Id;
}
如果(!string.IsNullOrEmpty(位置))为else
{
//过滤到关键字saddressions//
字符串位置标准=清洁位置(位置);
addressPTQuery=addressPTQuery.Where(p=>p.PTCouncil.NameStandard==locationStandard);
关键字saddresses=来自关键字saddresses中的
在addressPTQuery中加入b。Id等于b.Id
选择a.Id;
}

你好,谢谢!但是,是否有一种更干净的方法来构建初始查询并在必要时仅使用一行代码应用过滤器?感谢您在本示例中获得所有地址并应用一行过滤器
其中
什么不清楚?我在想,如果使用基本查询而仅应用查询是不可能的。对于最终的两个过滤器,您知道如何实现吗?示例中的哪些内容与您想要的不一致?在这里,我们首先查询
关键字address
,然后只应用
where
选择

var addressPTQuery = _addressPTRepository.Query;
var categoryQuery = _categoryRepository.Query; 
var keywordSearchQuery = _keywordSearchRepository.Query;

// Initial value of keywordsAddresses //
var keywordsAddresses = from ks in keywordSearchQuery 
                        where splitKeywords.Contains(ks.Name) 
                        select ks.Keyword.Addresses;

var searchResults = new CategoryGetAllBySearchListDto();

if (isUserCenter)
{
    // Filter to keywordsAddressIds  //

    DbGeography centerPoint = Map.CreatePoint(userLng, userLat);

    // radius is in kms so we have to x 100 to get meters
    ks.Keyword.Addresses.Select(ad => ad.Id) == addressPTQuery.Where(p => p.Location.Distance(centerPoint) < radius * 1000).Select(adPT => adPT.Id));

    keywordsAddressIds = from p in keywordsAddresses 
                         where p.Location.Distance(centerPoint) < radius * 1000
                         select p.Id;
}
else if (!string.IsNullOrEmpty(location))
{
    // Filter to keywordsAddressIds  //

    string locationStandard = CleanLocation(location);

    addressPTQuery = addressPTQuery.Where(p => p.PTCouncil.NameStandard == locationStandard);

    keywordsAddressIds = from a in keywordsAddresses
                         join b in addressPTQuery on a.Id equals b.Id
                         select a.Id;
}