【问题标题】:Add new record var LINQ添加新记录 var LINQ
【发布时间】:2014-08-06 15:05:14
【问题描述】:

我正在尝试向 var "issue" 添加一条新记录。我从 SQL Server 数据库中获取 XXX 列表,并为 jTable 网格返回如下:

public dynamic XXXList(int CCC)
    {
        try
        {
            var issue = db.XXX.ToList().
                Select(c => new { DisplayText = c.AAA, Value = c.BBB, c.CCC}).
                Where(h => h.HHH == JJJ);

            return (new { Result = "OK", Options = issue });
        }
        catch (Exception ex)
        {
            return (new { Result = "ERROR", Message = ex.Message });
        }
    }

函数返回:

{
    "$id": "1",
    "Result": "OK",
    "Options": [
        {
            "$id": "2",
            "DisplayText": "Food and Beverages",
            "Value": 4,
            "CCC": 4
        },
        {
            "$id": "3",
            "DisplayText": "Wrong software versions",
            "Value": 5,
            "CCC": 4
        }
    ]
} 

如何在返回之前向问题变量添加另一条记录? 示例:

{
    "DisplayText": "new display text",
    "Value": 5,
    "CCC": 4
}

编辑:

这是我应用答案后的功能:

public dynamic XXXList(int CCC)
{
    try
    {
        var newRecord = new[] { new { DisplayText = "None", Value = -1, CCC  = -1} };

        var issue = db.ProjectXXXs.Where(h => h.CCC == JJJ).Select(c => new { DisplayText = c.AAA, Value = c.BBB, c.CCC }).ToList().Concat(newRecord);

        return (new { Result = "OK", Options = issue });
    }
    catch (Exception ex)
    {
        return (new { Result = "ERROR", Message = ex.Message });
    }
}

非常感谢大家的帮助。

【问题讨论】:

  • 为什么要调用ToList()之前投影和过滤?
  • 感谢您指出这一点。我把它移到了哪里。如果你不介意我问这有什么不同?
  • 它将返回表中的每一行,创建对象,然后在内存中过滤它们,而不是在 SQL 查询中添加where...
  • 感谢特雷弗的解释。

标签: c# json linq


【解决方案1】:

连接任何其他项目:

var additional = new[] {new { DisplayText = ..., Value = ..., CCC = ... },
                        new { DisplayText = ..., Value = ..., CCC = ... }};

var issue = db.XXX.
    Where(h => h.HHH == JJJ).
    Select(c => new { DisplayText = c.AAA, Value = c.BBB, c.CCC}).
    ToList().
    Concat(additional);

(编辑:将 Where、Select 和 ToList 的重新排序归功于 James Curran。)

【讨论】:

  • 嗯...我认为 C# 会考虑这三个不同的匿名类,但 JSON 序列化程序可能不在乎。
  • @JamesCurran:只要您以相同的顺序和相同的类型定义成员,C# 就会认为它们属于 same 类型。来自MSDN 的引用:“如果程序集中的两个或多个匿名对象初始值设定项指定了一系列具有相同顺序且具有相同名称和类型的属性,编译器会将这些对象视为相同的实例类型。它们共享相同的编译器生成的类型信息。"
【解决方案2】:

您要做的第一件事就是将 ToList() 移到末尾。使用 ToList 所在的位置,您将从数据库中的每条记录中读取每一列,从中构建一个列表,然后搜索它。使用最后的 ToList,您向数据库发送仅针对该记录的那些列的查询,然后根据返回的内容构建一个列表。您还需要将 Where 移到 Select 之前,因此它适用于 XXX 记录,而不是 select 的输出。

var issue = db.XXX
    .Where(h => h.HHH == JJJ)
    .Select(c => new { DisplayText = c.AAA, Value = c.BBB, c.CCC})
    .ToList();

从这里开始,其他人建议的 AddConcat 选项应该可以工作,但是,您可能必须使用命名类而不是匿名类。

 class OptionValues
 {
      public string DisplayText {get; set;}
      public int  Value {get; set;}
      public int  CCC {get; set;}
 }

 // :
 // :
  .Select(c => new OptionValues {DisplayText = c.AAA, Value = c.BBB, CCC= c.CCC})

【讨论】:

  • 非常感谢James的解释,非常感谢!
【解决方案3】:

我不确定,但你不能在 var 问题下写一行:

issue.Add(new { });

当然是你想要的值。

【讨论】:

  • 不,这是不可能的,因为Where() 返回一个IEnumerable,它不公开写方法。
  • 非常感谢您的解释。我还是 C# 的初学者,我会仔细研究这方面的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多