gpt4 book ai didi

c# - 如何添加到 .net 中的 RavenDB List

转载 作者:行者123 更新时间:2023-11-30 12:19:55 25 4
gpt4 key购买 nike

更新:我通过将工作代码复制粘贴到一个新的干净项目中来修复它。我不知道为什么我会遇到那个错误,但只要它消失了

我在弄清楚如何做我想做的事情时遇到了问题。在这个例子中,我有一个商家数据库,我希望能够将场所作为列表添加到数据库中的商家条目中。出于某种原因,我不知道为什么,我可以获取商家,但似乎无法获取我获取的条目的 ID,然后更新它。 (我在更新时也遇到了一些问题,据我所知,我需要我想要的条目的 ID,然后我可以用补丁更新......对吧?)

这是我的 Json 类:

 public class Merchant
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "venues")]
public List<Venue> venues { get; set; }

}

public class Venue
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "tills")]
public List<Till> tills { get; set; }
}

public class Till
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
}

这是我的 RavenDB 处理程序类的相关函数:

 public List<JObject> QueryFromDb(string query)
{
List<Object> objReturned;
List<JObject> jObjects = new List<JObject>();
using (IDocumentSession session = store.OpenSession())
{
objReturned = session
.Advanced.RawQuery<Object>(query)
.ToList();
}
for (var i = 0; i < objReturned.Count; i++)
{
var json = JsonConvert.SerializeObject(objReturned[i], Formatting.Indented);
jObjects.Add(JObject.Parse( json.ToString()));
}

return jObjects;
}


public String GetJsonFromDB(string query)
{
string returnStr = "";
List<JObject> myResponse = QueryFromDb(query);
for (var i = 0; i < myResponse.Count; i++)
{
var json = JsonConvert.SerializeObject(myResponse[i], Formatting.Indented);
returnStr += json.ToString();
}
return returnStr;
}

这是我试图获取 ravendb 条目的 ID:

 public void UpdateMerchantList()
{
merchantGrid.Rows.Clear();
List<JObject> myResponse = ravenDB.QueryFromDb("from Merchants");
for (var i = 0; i < myResponse.Count; i++)
{
var json = JsonConvert.SerializeObject(myResponse[i], Formatting.Indented);
Merchant merchant = new Merchant(json.ToString());
if (myResponse[i].Property("Id") != null) { merchant.MyID = myResponse[i].Property("Id").ToString(); }
merchantGrid.Rows.Add(merchant.MyID, merchant.name);
}
}

出于某种原因,我将这段代码移植到控制台应用程序中,并让它与这段代码一起工作:

  List<JObject> result = ravenDb.QueryFromDb("from Merchants");
for(var i = 0; i < result.Count; i++)
{
Console.WriteLine(result[i].Property("Id").ToString());
}

这确实给了我想要的东西:“Id”:“商家/97-A”“ID”:“商家/98-A”“身份证”:“商家/129-A”"id": "merchants/130-A"

但是当我将它移植回我的表单并尝试将其添加到数据 GridView 时,我再也看不到它了。

更新:已经能够将列表添加到控制台应用程序中的商户类别中。这是代码。

 public void AddVenue(string idArg,Venue venue)
{
using (IDocumentSession session = store.OpenSession())
{

var merchant = session.Load<Merchant>(idArg);
List<Venue> venuesList = new List<Venue>();
if (merchant.venues == null) { session.Advanced.Patch(merchant, m => m.venues, venuesList); }
else
{
session.Advanced.Patch(merchant,
x => x.venues,
venues => venues.Add(venue));
}
session.SaveChanges();

}
}

只是为了让人们理解我在说什么:这是从表单应用程序输出的 json: No metadata, no id

为什么?

当在控制台中使用几乎相同的代码(复制粘贴)时,我得到了这个: See how much better this looks?

我从一个应用程序获取的数据比另一个应用程序多,我真的非常想要这个 ID。

我想我将把代码重构到一个 wcf 应用程序中。只是因为。也许我会不小心修复它。

最佳答案

您可以直接加载给定类的对象,无需自己处理 JSON(反)序列化,除非有特殊原因。

此外,当您不想加载文档(以节省带宽)时,使用补丁更有用。当您已经加载文档时,您可以简单地更改它并保存更改。

引用如下代码:

public class Merchant
{
// note added Id property
public string Id { get; set; }
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "venues")]
public List<Venue> venues { get; set; }
}

public class Venue
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "tills")]
public List<Till> tills { get; set; }
}

public class Till
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
}


public void MerchantsTest()
{
using (var store = GetDocumentStore())
{
using (var session = store.OpenSession())
{
session.Store(new Merchant { Id = "merchant-1", name = "merchant1", venues = new List<Venue> { new Venue { name = "venue-1A", tills = new List<Till> { new Till { name = "till-1A-first" } } } } });
session.Store(new Merchant { Id = "merchant-2", name = "merchant2", venues = new List<Venue> { new Venue { name = "venue-2A", tills = new List<Till> { new Till { name = "till-2A-first" } } } } });

session.SaveChanges();
}

using (var session = store.OpenSession())
{
// you can load all merchants
var merchants = session.Query<Merchant>(null, "Merchants").ToList();

// or load specific merchant by ID
var merchant2 = session.Load<Merchant>("merchant-1");

// add a venue to a loaded merchant (not using patch but simply adding the object)
merchant2.venues.Add(new Venue { name = "venue-2B", tills = new List<Till> { new Till { name = "till-2B-first" } } });

session.SaveChanges();
}
}
}

关于c# - 如何添加到 .net 中的 RavenDB List<type>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54576071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com