【问题标题】:How to fill a Tuple whit the out of a query select如何从查询选择中填充元组
【发布时间】:2020-12-29 00:28:07
【问题描述】:
    public List<Tuple<int, int>> GetTupleDetailedLog()
    {
        var query = (from c in _context.Lk_business_rules
                     join v in _context.Business_rules_detailed_log on c.User_story_number equals v.User_story_number
                     where c.Status_id_fk == 3
                     group new { c, v } by new { c.Rule_description, c.User_story_number } into cv
                     select new
                     {
                         us = cv.Select(cv => cv.v.User_story_number), //this should be the first int on tuple
                         count = cv.Select(cv => cv.v.Row_id.Count()), //this should be the second int on tuple
                     });
        var TupleList = new List<Tuple<int, int>>();
        foreach (var item in query)
        {
            TupleList.Add(new Tuple<int, int>(Convert.ToInt32(item.us), Convert.ToInt32(item.count)));
        }
        return TupleList;
    }

我在这里有一个新问题,我有一个元组列表,我想用查询选择的输出填充它。这段代码帮助了我,但现在我遇到了运行时错误:

InvalidOperationException: LINQ 表达式 '(GroupByShaperExpression: KeySelector: new { Rule_description = (l.Rule_description), User_story_number = (l.User_story_number) }, ElementSelector:new { c = (EntityShaperExpression: EntityType: Lk_business_rules ValueBufferExpression: (ProjectionBindingExpression: c) IsNullable: False), v = (EntityShaperExpression: EntityType: Business_rules_detailed_log ValueBufferExpression: (ProjectionBindingExpression: v) IsNullable: False) } ) .Select(cv => cv.v.User_story_number)' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。

还有:

处理请求时发生未处理的异常。 InvalidOperationException: LINQ 表达式'(GroupByShaperExpression:

要么以可翻译的形式重写查询,要么通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关更多信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038。 Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)

涉及的数据:

问题在于获取一个具有两个值的元组,以添加到未与数据库映射的实体。

所以,一方面我们有业务规则,其中包含它们的状态(我们必须按状态 3 过滤)并包含一个 Rows_id,我们必须将它与Detailed_log 中的相同字段交叉,并在按相同字段分组后,计算每个 Row_id 有多少行,在 detail_log 中(什么会给我们我们必须放在元组的第二个字段中的错误)

这就是为什么我需要 join 和 group by,以及 where 中的 state 过滤器。

【问题讨论】:

  • 请公布正在编译的查询代码。
  • cv.Select(cv - 无法编译!
  • Row_id.Count() - 什么是Row_id?是不是有顺序?还是标量?
  • .Select(...), //this should be ... int on tuple - 选择返回序列。它不能是单个数字。
  • Row_id 是数据库中的 VARCHAR(MA) 我刚刚发现:( 即使它充满了数字,我也无法从数据库中更改类型,我可以从查询中应用一些转换吗?我不要相信

标签: c# sql linq tuples


【解决方案1】:

你不能只将查询结果选择到Tuple&lt;int, int&gt; 实例中吗?

return query.Select(x => new Tuple<int, int>(x.number, x.count)).ToList();

【讨论】:

  • 我会试试这个!谢谢...看我的编辑,我已经可以让它工作了,但是现在我遇到了运行时错误,也许它与查询有关
  • 我试过这个,同样的错误......我认为查询是问题,但我不知道其他方法来解决这个问题,因为我需要这个组
  • 您在查询中的 Select 似乎有缺陷。也许你想要类似.Select(cv =&gt; new { number = cv.Key.User_story_number, /*this should be the first int on tuple*/ count = cv.Count(), /*this should be the second int on tuple*/ });
  • 我会试试这个,我不知道我们是否可以混合查询和 linq 方法......但我可以找到方法
【解决方案2】:

我正在使用 .net Core。这里有一些你可以操作元组的方法。正如@kalu93 所说,您应该能够在选择中轻松创建元组。事实上,在您的查询中,您可以使用元组而不是匿名类型。下面是一些元组、值元组以及创建和分解两者的示例:

    static void Main(string[] _)
    {
        (int, int)[] intPairs = new (int, int)[] {
            (1,1),(2,2),(3,3),(4,4),(5,5)
            };

        List<(int, int)> valueTuples = intPairs.ToList();
        List<(int, int)> valueTuples2 = intPairs.Select(x => (x.Item1, x.Item2)).ToList();
        List<Tuple<int, int>> tuples = intPairs.Select(x => new Tuple<int, int>(x.Item2, x.Item2)).ToList();

        List<Tuple<int, int>> tuples2 = new List<Tuple<int, int>>();
        foreach (var(first,second) in intPairs)
        {
            tuples2.Add(new Tuple<int, int>(first, second));
        }

        List<Tuple<int, int>> tuples3 = new List<Tuple<int, int>>();
        foreach (var (first, second) in tuples)
        {
            tuples3.Add(new Tuple<int, int>(first, second));
        }

        List<(int, int)> valueTuples3 = new List<(int, int)>();

        foreach (var (first, second) in tuples)
        {
            valueTuples3.Add((first, second));
        }

        Console.WriteLine(Enumerable.SequenceEqual(valueTuples, valueTuples2));
        Console.WriteLine(Enumerable.SequenceEqual(valueTuples, valueTuples3));
        Console.WriteLine(Enumerable.SequenceEqual(tuples, tuples2));
        Console.WriteLine(Enumerable.SequenceEqual(tuples, tuples3));
    }

【讨论】:

  • 非常感谢 - 我已经可以让它工作了,但是现在我遇到了运行时错误,可能与查询有关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多