当前位置: 首页 > 编程语言 > C#

使用LINQ进行动态表达式,怎么找厨房?分享

时间:2023-04-10 12:29:40 C#

使用LINQ进行动态表达。怎么找厨房?我尝试实现用户动态过滤器,其中使用选择一些运算符选择一些属性并选择值。由于我没有找到这个问题的答案,所以我尝试使用LINQ表达式。主要是我需要确定主房间是厨房的所有房子(我知道任何意义)。使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Linq.Expressions;//使用System.Linq.Dynamic;namespaceConsoleApplication2{classProgram{staticvoidMain(string[]args){RoomaRoom=newRoom(){Name="aRoom"};房间bRoom=newRoom(){Name="bRoom"};房间cRoom=newRoom(){Name="cRoom"};HousemyHouse=newHouse{Rooms=newList(newRoom[]{aRoom}),MainRoom=aRoom};HouseyourHouse=newHouse(){Rooms=newList(newRoom[]{bRoom,cRoom}),MainRoom=bRoom};HousedonaldsHouse=newHouse(){Rooms=newList(newRoom[]{aRoom,bRoom,cRoom}),MainRoom=aRoom};varhouses=newList(newHouse[]{myHouse,yourHouse,donaldsHouse});//varkitchens=houses.AsQueryable().Where("MainRoom.Type=RoomType.Kitchen");//Console.WriteLine("厨房数={0}",kitchens.Count());varhouseParam=Expression.Parameter(typeof(House),"house");varhouseMainRoomParam=Expression.Property(houseParam,"MainRoom");varhouseMainRoomTypeParam=Expression.Property(houseMainRoomParam,"类型");varroomTypeParam=Expression.Parameter(typeof(RoomType),"roomType");varcomparison=Expression.Lambda(Expression.Equal(houseMainRoomTypeParam,Expression.Constant("厨房",typeof(RoomType))));//??????????????????不工作varkitchens=houses.AsQueryable().Where(comparison);Console.WriteLine("厨房数={0}",kitchens.Count());控制台.ReadKey();}}publicclassHouse{publicstringAddress{get;放;}publicdoubleArea{get;放;}publicRoomMainRoom{get;放;}publicListRooms{get;放;}}publicclassRoom{publicdoubleArea{get;放;}公共字符串名称{得到;放;}publicRoomTypeType{get;放;}}publicenumRoomType{Kitchen,Bedroom,Library,Office}}varkitchens=fromhinhouses其中h.MainRoom.Type==RoomType.Kitchenselecth;但您必须先在房间中设置RoomType属性好的,编辑:所以你必须重新定义:varcomparison=Expression.Lambda>(...然后,当你使用它时:varkitchens=houses.AsQueryable().Where(comparison.Compile());编辑#2:好的,开始吧:varroomTypeParam=Expression.Parameter(typeof(RoomType),"roomType");//????????????????????????????不起作用varcomparison=Expression.Lambda>(Expression.Equal(houseMainRoomTypeParam,Expression.Constant(Enum.Parse(typeof(RoomType),"Kitchen"),typeof(RoomType))),houseParam);//???????????????????????????不工作varkitchens=houses.AsQueryable().Where(comparison);编辑#3:为了你的需要,我出于现在的想法。最后给你一个:在String类型上声明一个扩展方法:internalstaticobjectPrepare(thisstringvalue,Typetype){if(type.IsEnum)returnEnum.Parse(type,value);returnvalue;}然后在表达式中使用它,例如:Expression.Constant("Kitchen".Prepare(typeof(RoomType)),typeof(RoomType))这是因为显然枚举的处理方式不同。此扩展将保留字符串Doesnot更改为其他类型。缺点:您必须在其中添加另一种typeof()。//??????????????????不工作varkitchens=houses.AsQueryable().Where(comparison);其中method以Func或Expression>作为参数,但变量比较的是LambdaExpression类型,不匹配。您需要使用该方法的另一个重载:varcomparison=Expression.Lambda>(Expression.Equal(houseMainRoomTypeParam,Expression.Constant("Kitchen",typeof(RoomType))));//现在比较的类型是Expression>//Expression.cs中的重载publicstaticExpressionLambda(Expressionbody,paramsParameterExpression[]parameters);我不会以这种方式构建where子句-我认为它比您需要的更复杂。相反,你可以结合这样的where子句:varhouses=newList(newHouse[]{myHouse,yourHouse,donaldsHouse});//始终返回true的基本谓词:FunchousePredicate=h=>1==1;//从用户输入中获得的房间名称:stringuserEnteredName="aRoom";//如果合适,添加房间名称谓词:if(!string.IsNullOrWhiteSpace(userEnteredName)){housePredicate+=h=>h.MainRoom.Name==userEnteredName;}//从用户输入得到的房间类型:RoomType?userSelectedRoomType=RoomType.Kitchen;//如果合适,添加房间类型谓词:if(userSelectedRoomType.HasValue){housePredicate+=h=>h.MainRoom.Type==userSelectedRoomType.Value;}//MainRoom.Name="aRoom"andRooms.Count=3或//????????????????????????????varaRoomsHouses=houses.AsQueryable().Where(housePredicate);我测试过这个,诚实:)那个呢varkitchens=houses.SelectMany(h=>h.Rooms,(h,r)=>new{House=h,Room=r}).Where(hr=>hr.Room.Type==RoomType.Kitchen).Select(hr=>hr.House);要向DynamicLinq添加新的枚举类型,您必须添加以下代码:typeof(Enum),typeof(T)T:Enumtype在预定义的动态类型中,这对我有用。以上就是C#学习教程:使用LINQ进行动态表达。怎么找厨房?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: