簡體   English   中英

當列表字段中的值與列表中的條件值匹配時,在C#中使用LINQ查找MondoDB記錄

[英]Use LINQ in C# to find MondoDB records when values in a list field match a criteria value from a list

我想使用LINQ返回MongoDB集合中的所有記錄,其中記錄中的字段是字符串列表,列表中的任何字符串都與用作搜索條件的字符串列表中的任何字符串值匹配:

集合中的Mongo記錄(“項目”):

{
    "_id": ...,
    "StringList": [
        "string1",
        "string2",
        "string3"
    ],
    ...
}

搜索條件:

var criteria = new List<string> { "string2", "string4" };

我的代碼:

var foundItems = iMongoDataProvider.FindAll<Item>()
                           .Where(x =>x.StringList.ContainsAny(criteria)).ToList();

基於上述內容,由於StringList值之一與搜索條件中的值之一匹配,因此應返回Mongo記錄。 即使我可以手動細讀集合並找到匹配的記錄,也不會返回任何內容。 我究竟做錯了什么? 有人可以提供一個可以滿足我需要的示例嗎? 謝謝!

您是否嘗試過類似的方法:

using System;
using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using System.Linq;
using System.Linq.Expressions;

var foundItems = _collection.FindAll(x=> criteria.Any(cc=> xx.StringList.Contains(cc))).ToList();

其中_collectionIMongoCollection<TEntity> _collection

您正在尋找的是ElemMatch篩選器( https://docs.mongodb.com/v3.2/reference/operator/query/elemMatch/ ):

var foundItems = collection.Find(Builders<Item>.Filter.ElemMatch(
                     x => x.StringList,
                     s=>criteria.Contains(s)));

我建議您在哪里使用IMongoCollection<Item>集合,即您正在使用FindAll ,這意味着您的MongoDb驅動程序的版本為1.x(請參見此處的更多信息: MongoDB .NET Driver 2.0中的FindAll ),我建議更新您的驅動程序,因為此版本不是最新的。 還是有重要原因不這樣做?

服務器上的此過濾器查詢。 確保您可以將數據獲取為IEnumerable並在本地進行過濾:

var foundItems = collection.Find(x=>true)
                   .ToEnumerable()
                   .Where(x => x.StringList.Intersect(criteria).Any());

如果您的數據不是很大,並且可以對客戶端進行篩選,那么這也是一種好方法。

如果您已經在執行FindAll ,這意味着您將獲取所有數據,則可以使用intersect查詢:

var foundItems = iMongoDataProvider.FindAll<Item>()
                           .Where(x => x.StringList.Intersect(criteria).Any());

您要知道兩個列表的交集是否具有任何值:

 .Where(x =>x.StringList.Intersect(criteria).Any())

我不確定您的代碼出了什么問題,但這是工作代碼

void Main()
{
    List<string> []StringList = new List<string>[] {
             new List<string> {    "string1", "string2", "string3" },
             new List<string> {    "string11", "string12", "string13" },
             new List<string> {    "string21", "string22", "string4" }
    };

    var criteria = new List<string> { "string2", "string4" };

    var foundItems = StringList
                      .Where(x => x.Intersect(criteria).Any()).ToList();

    foundItems.Dump();
}

我使用LinqPad進行了測試(我向使用Linq的任何人推薦它,並且它是免費的)。

暫無
暫無

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

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