Linq表达式理解错误

var userInfo = UserInfoService.LoadEntities(u=>u.ID==LoginUser.ID).FirstOrDefault();
            //获取登录用户的角色.
var userRoleInfo = userInfo.RoleInfo;

//Linq表达式一:
var loginUserMenuActions = (from r in userRoleInfo
                                            from a in r.ActionInfo
                                            where a.ActionTypeEnum == actionTypeEnum
                                            select a).ToList();

//Linq表达式二:
var allUserActions = from r in userRoleInfo
                                select r.ActionInfo;
var mm = (from a in allUserActions
                  where a.ActionTypeEnum == actionTypeEnum
                  select a).ToList();

//Linq表达式二是错误的,因为执行这句where a.ActionTypeEnum == actionTypeEnum的时候,allUserActions是一个大集合里面包含很多小集合,所以遍历allUserActions得到变量a是一个集合。一个集合里面没有ActionTypeEnum这个属性,所以a.ActionTypeEnum是错误的。

//但是Linq表达式一是对的,因为两个from相当于两次for循环,所以a不是一个集合,是一个ActionInfo

  总结:注意Linq语句from的使用,如果是集合要小心,from一次然后select得到的可能是一个集合中包着许多集合,这时候要from两次,类似for循环两遍

时间: 2024-11-10 03:53:12

Linq表达式理解错误的相关文章

委托是怎么最终变成linq表达式的?(上)

前不久,给学生们做培训,讲到C#语言委托部分的时候.我用了一天的时间.把委托讲到了linq表达式.但是呢!学生们反应并不是很好.貌似没有彻底领悟到这其中的过程.我写下这篇文章.也算是对学生们一个交代总结吧! 什么是委托? 我们其实可以把委托理解成含有一个或者多个方法的对象.我们在大多数时候用到委托都是在”执行“这个对象.但是委托却又和一般的对象不同,我们需要执行他所拥有的方法. 下面是一个示例代码 using System; using System.Collections.Generic; u

Linq表达式、Lambda表达式你更喜欢哪个?

什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在<深入理解C#>中称为点标记. 查询表达式.点标记你更喜欢哪个? 所以,我们的标题的提问根本就不合适.应该是"查询表达式和点标记你更喜欢哪个?".如: //查询表达式 var students1 = from t in db.Students where t.Name == &q

通过LINQ表达式树动态构建查询条件

第一种方法: public static class PredicateExtensions { public static Expression<Func<T, bool>> True<T>() { return f => true; } public static Expression<Func<T, bool>> False<T>() { return f => false; } public static Expr

LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”

Expression<Func<Order_info, bool>> expre = expression; var q = db.order_info; IQueryable<Order_info> query = q; if (expre != null) { query = query.Where(expre); } 修改为: 1 Expression<Func<Order_info, bool>> expre = expression;

Android studio常量表达式的错误

今天在AS上集成Zxing的库,出现了如下的错误: 常量表达式的错误 这个错误是switch case的问题,提示换成if else 在AS中我们使用Alt+Enter(opt+Enter for Mac)快捷键直接将switch转换为if else,如下图所示: 在Tools Android的网站上有详细的说明,主要是避免多个库之间出现资源冲突 Non-constant Fields in Case Labels In a regular Android project, constants

Linq表达式和Lambda表达式用法对比

什么是Linq表达式?什么是Lambda表达式?前一段时间用到这个只是,在网上也没找到比较简单明了的方法,今天就整理了一下相关知识,有空了再仔细研究研究 public Program() { List<Student> allStudent = new List<Student> { new Student("张三",23), new Student("李四",29), new Student("王二",25), new

LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”

我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”. 在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.NotSupportedTranslator.Translate(ExpressionConverter

Linq表达式写法

Linq表达式,实现按照某个字段排序的简单写法. 做项目的时候遇到的一个简单问题,于是记下来. 列举一个例子: <T> model=new <T>(); 加入model中有要根据字段主键id,然后部门id=1排序. Linq写法: var quary=from r in model where r.部门id=1 orderBy r.主键id select r; foreach(model r in quary) { Console.WriteLiner(r); }

LINQ 表达式树

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Linq.Expressions; namespace ConsoleApplication3 {     class Program     {         static void Main(string[] args)