簡體   English   中英

如何使用 LINQ 的 AsQueryable() 從 MongoDB 的內部數組中獲取數據?

[英]How do I get data from inner array in MongoDB using LINQ's AsQueryable()?

我無法從 MongoDB 的內部數組中獲取數據。 我得到錯誤:

BsonSerializationException: No matching creator found.

這是我在 MongoDB、查詢和環境中的數據示例。

{
        "Id" : 1,
        "compName" : "Samsung Electronics Co.",
        "symbol" : "005930-KRX",
        "analyst" : [
                {
                        "analystId" : 4,
                        "analystInit" : "SJ",
                        "analystFName" : "Steve",
                        "analystLName" : "Jobs",
                        "analystEmail" : "steve.jobs@apple.com"
                }
        ],
        "associates" : [
                {
                        "analystId" : 7,
                        "analystInit" : "BG",
                        "analystFName" : "Bill",
                        "analystLName" : "Gates",
                        "analystEmail" : "bill.gates@microsoft.com"
                },
                {
                        "analystId" : 10,
                        "analystInit" : "MJ",
                        "analystFName" : "Michael",
                        "analystLName" : "Jordan",
                        "analystEmail" : "michael.jordan@nba.com"
                }
        ],
        "gics" : "75301020",
        "cusip" : null
}

POCO

[BsonIgnoreExtraElements]
class CompanyClass
{
    #region [ Properties ]
    [BsonElement("issuerId")]
    public Int32 IssuerId { get; set; }
    [BsonElement("compName")]
    public string CompName { get; set; }
    [BsonElement("symbol")]
    public string Symbol { get; set; }
    [BsonElement("analyst")]
    public IEnumerable<AnalystClass> Analyst { get; set; }
    [BsonElement("associates")]
    public IEnumerable<AnalystClass> Associates { get; set; }
    [BsonElement("gics")]
    public string Gics { get; set; }
    [BsonElement("cusip")]
    public string Cusip { get; set; }
    #endregion
}
[BsonIgnoreExtraElements]
class AnalystClass
{
    #region [ Properties ]
    [BsonElement("init")]
    public string ResAnInit { get; set; }
    [BsonElement("firstName")]
    public string ResAnFirstName { get; set; }
    [BsonElement("lastName")]
    public string ResAnLastName { get; set; }
    [BsonElement("email")]
    public string ResAnEmail { get; set; }
    #endregion
}

詢問:

compCollection = GetMonDB("Companies").GetCollection<CompanyClass>("coverage");
var comps = compCollection.AsQueryable()
.Select(c => new { 
    CompName = c.CompName,
    Symbol = c.Symbol,
    ResAnsFName = c.Analyst.Select(x => x.ResAnFirstName)  <-- Problem line
    CUSIP = c.Cusip
});

我想得到這個:

在此處輸入圖像描述

我的環境:

C# MongoDB.Driver = 2.12
MongoDB = 4.2
Windows = Win10

看來我錯過了一些明顯的東西。 我究竟做錯了什么?

只需像這樣進行投影:

var comps = await compCollection
    .AsQueryable()
    .Select(c => new
    {
        ...
        ResAnsFName = c.Analyst.first().ResAnFirstName
        ...
    })
    .ToListAsync();

ResAns 屬性在 CompanyClass class 中不存在,因此您不能使用該屬性。 BsonElements 也與您的 MongoDB 數據不匹配。 Select 應該足以執行 Linq,不需要 FirstorDefault 或 ToList()。

 ResAnsFName = c.Analyst.Select(x => x.ResAnFirstName)

更新

布森:

{ 
  "_id" : ObjectId("59ce6b34f48f171624840b05"), 
  "name" : "Nikola", 
  "blog" : "rubikscode.net", 
  "age" : 30, 
  "location" : "Beograd" 
}

C# 強類型 object:

    public class User
    {
        [BsonId]
        public ObjectId Id { get; set; }
        [BsonElement("name")]
        public string Name { get; set; }
        [BsonElement("blog")]
        public string Blog { get; set; }
        [BsonElement("age")]
        public int Age { get; set; }
        [BsonElement("location")]
        public string Location { get; set; }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM