首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ select:要将集合传递到CONTAINS中

LINQ select:要将集合传递到CONTAINS中
EN

Stack Overflow用户
提问于 2015-05-31 19:33:02
回答 2查看 175关注 0票数 1

该页面有6个下拉列表,用户可以选择单个项目或将列表保留在第一个项目上,即“任意”。那样的话,我想把所有的都还给你。例如,如果用户选择了土壤下坠.任何选择,沙,土和粘土。如果他们选择任何一个,我想从土壤表中选择所有的土壤类型。如何将土壤类型的集合传递到一个容器中?类似于:

代码语言:javascript
复制
*where soil.SOIL1.Contains("Sand", "Loam", "Clay")*

public List<PlantList> getMultiSelectPlantSearchResultBeSoMoLiHeZo(string Benefit, string Soil, string Moisture, string Light, string Height, string Zone)
{
    var plantList = from plant in db.PLANTs
                    join benefit in db.BENEFITs on plant.PLANT_ID equals benefit.PLANT_ID
                    join soil in db.SOILs on plant.PLANT_ID equals soil.PLANT_ID
                    join moisture in db.MOISTUREs on plant.PLANT_ID equals moisture.PLANT_ID
                    join light in db.LIGHTs on plant.PLANT_ID equals light.PLANT_ID
                    join height in db.HEIGHTs on plant.PLANT_ID equals height.PLANT_ID
                    join zone in db.ZONEs on plant.PLANT_ID equals zone.PLANT_ID
                    where plant.PLANT_ID == benefit.PLANT_ID
                    && benefit.BENEFIT1 == Benefit
                    && soil.SOIL1 == Soil
                    && moisture.MOISTURE1 == Moisture
                    && light.LIGHT1 == Light
                    && height.HEIGHT1 == Height
                    && zone.ZONE1 == Convert.ToInt16(Zone)
                    select new PlantList
                    {
                        plantId = plant.PLANT_ID,
                        plantName = plant.PL_NAME,
                        plantGenus = plant.PL_GENUS,
                        plantSpecies = plant.PL_SPECIES,
                        plantDesc = plant.PL_DESC,
                        plantImageThumb = plant.PL_IMAGE_THUMB,
                        plantBenefit = benefit.BENEFIT1,
                        plantSoil = soil.SOIL1,
                        plantMoisture = moisture.MOISTURE1,
                        plantLight = light.LIGHT1,
                        plantHeight = height.HEIGHT1,
                        plantZone = zone.ZONE1
                    };

    var DistinctItems = plantList.OrderBy(z => z.plantName).GroupBy(x => x.plantId).Select(y => y.FirstOrDefault()).ToList();
    return DistinctItems;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-31 21:07:24

您可以使用IQueryable的可组合性

代码语言:javascript
复制
IQueryable<Soil> soils = db.SOILs;

if (soilTypes.Any())
{
    soils = soils.Where(s => soilTypes.Contains(s.Type));
}

var plantList = from plant in db.PLANTs
                join benefit in db.BENEFITs on plant.PLANT_ID equals benefit.PLANT_ID
                join soil in soils on plant.PLANT_ID equals soil.PLANT_ID
...

soilTypes包含用户选择的类型(一个或多个类型作为字符串列表)。如果用户选择“任意”,它应该是一个空列表(这实际上意味着选择标准被忽略)。因此,您应该根据用户在UI中选择的内容编写soilTypes

这将被转换为一个SQL查询,soils是一个混合到plantlist查询中的表达式。

票数 1
EN

Stack Overflow用户

发布于 2015-05-31 20:27:45

您可以在where子句上创建一个ContainsAny方法并调用它,参见下面的测试示例:

代码语言:javascript
复制
public static bool ContainsAny(string searchField, params string[] words) {
            foreach(string word in words) {
                if(searchField.Contains(word))
                    return true;
            }

            return false;
        }


        public static void Main(string[] args){
            var list = new List<string>() { "test", "test2", "Sand", "Loam", "Clay" };
            var selectedList = from item in list where ContainsAny(item, "Sand", "Loam", "Clay")
                               select item;
            foreach(var item in selectedList) {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30561803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档