【问题标题】:LINQ increment value doesn't work [duplicate]LINQ 增量值不起作用 [重复]
【发布时间】:2018-03-09 13:56:30
【问题描述】:

我有这个 Linq

var company = db.Companies.Where(x => x.id == Id).Select(x => new Company
        {
            Id = x.id,
            Description = x.Description,
            Website = x.Website,
            Zip = x.Zip,
            Actions = db.Actions.Where(a => a.UserCompanyId == Id).Select((a, index) => new CompanyActions
            {
                Id = index + 1,
                Name = a.Name,
                Duration = (int)a.Duration
            }).ToList()
        })
            .FirstOrDefault();

我想获取操作 ID - 1,2,3,4,5,6,7,8......

但在这种情况下,索引不起作用。

Error - + $exception {"LINQ to Entities 无法识别方法'System.Linq.IQueryable1 Select(System.Linq.IQueryable1, System.Linq.Expressions.Expression1[System.Func3])' 方法,并且此方法不能翻译成商店表达式。"} System.NotSupportedException

所有问题都是如何在操作中增加 (+1) Id?想看1-名字2-名字3-名字

这很好

  var company = db.Companies.Where(x => x.id == Id).AsEnumerable().Select(x => new Company
        {
            Id = x.id,
            Description = x.Description,
            Website = x.Website,
            Zip = x.Zip,
            Actions = db.Actions.Where(a => a.UserCompanyId == Id).AsEnumerable().Select((a, index) => new CompanyActions
            {
                Id = index + 1,
                Name = a.Name,
                Duration = (int)a.Duration
            }).ToList()
        })
            .FirstOrDefault();

【问题讨论】:

  • 您正在尝试将db.Actions.Where 转换为委托(?),这就是我认为Actions 将持有的?这真的很时髦。你想做什么?
  • 自动递增 id 必须由数据库管理 否则多个软件会生成重复的 id(这会导致错误)
  • LINQ to Entities 查询被转换为 SQL。您不能使用没有等效 SQL 的表达式。 Enumerable.Select((IEnumerable<TSource>, Func<TSource, Int32, TResult>) 方法 加载数据后,例如 var items=query.AsEnumerable().Select((item,idx)=&gt;...)
  • Id - 它与数据库无关。这是我的身份证

标签: c# asp.net asp.net-mvc linq


【解决方案1】:

例外情况很明显:您在查询中使用了实体无法识别的方法。

实体框架必须为数据库翻译您的查询;但是数据库,通常在 SQL 上运行,不理解更复杂的方法,例如 Select(这绝不等同于 SQL SELECT)。

所以一开始,您使用的是 Linq-to-Sql,但之后您想使用 Linq-to-Objects。

为此,您必须将第一部分转换为可枚举,然后继续查询。

类似:

db.Companies.Where(x => x.id == Id).AsEnumerable().Select(x => new Company... //etc

【讨论】:

  • 这个问题是在这种情况下会导致N+1个查询。 OP 可能使用 DTO 作为 ViewModel 对象。一个更好的主意是分离它们,加载公司和操作DTO没有隐式连接并将DTO映射到显示带有行号的对象,表情符号
  • @Panagiotis 这完全正确;但我认为这超出了问题的范围。不过,值得深思的是,OP 确实应该阅读。
【解决方案2】:

您需要将计数器增量移到 LINQ 表达式之外,因为它不支持动态计算和/或某些字符串操作。

尝试添加到查询的末尾:

.Select( new { Id = Id++, /* plus the rest of your columns */ });

【讨论】:

  • 我认为 Id 是列的标识。如果是这样,您只是将 Id 增加到 1。
  • @Win - 是的,不确定 OP 想要完成什么......
猜你喜欢
  • 2013-06-30
  • 1970-01-01
  • 2019-08-10
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2012-08-04
相关资源
最近更新 更多