【问题标题】:How to search a context using a list of string and order it?如何使用字符串列表搜索上下文并对其进行排序?
【发布时间】:2020-02-10 10:58:49
【问题描述】:

我有一个需要在上下文中搜索的字符串数组。

List<string> nameList

我有一个要搜索的上下文

context.Name

我的代码在这里:

            List<Guid> nameIds= context.Name
                .Where(n => nameList.Contains(n.Description)
                .Select(n=> n.NameId)
                .ToList();

我可以获得我的名字的 ID,但我希望它按 nameList 排序,而不是按上下文本身。

例如。我的数据库中的名字分别是 [Ben, Maria, Liza] 和 [0, 1, 2] id。我的nameList 是 [Liza, Maria] 井井有条。 nameIds 将是 [1,2] 因为它是按上下文排序的。我希望它由nameList 订购; [2,1]

【问题讨论】:

  • 请检查发布的答案,如果它解决了您的问题,请告诉我。

标签: c# asp.net .net entity-framework entity-framework-core


【解决方案1】:

您可以通过Linq JoinOrderBy 操作根据nameList 的项目顺序进行排序。以下语句结果具有基于nameList 的项目顺序的NameId 集合。

List<Guid> nameIds = context.Name.Where(n => nameList.Contains(n.Description)).ToList()
                          .Join(nameList, n => n.Description, l => l, (n, l) => new {n.NameId, l})
                         .OrderBy(o => o.l)
                         .Select(s => s.NameId).ToList();

如果您在上面注意到:

  • 我将Where with Contains 查询保持不变,以确保仅从数据库返回过滤后的数据。如果您删除此子句并进行直接连接,则将从数据库返回完整的数据集,这可能会导致您的应用程序出现性能问题。
  • 在返回IQueryable,ToList 时执行查询以从数据库中获取数据
  • Join 操作加入数据库数据和nameList
  • OrderBy根据描述对数据进行排序(nameList项目的实际顺序)
  • Select 选择 NameId

创建了thisdotnetfiddle 来演示整个 linq 语句的工作原理。

【讨论】:

  • 稍后将在我的代码上尝试并回复您。谢谢老哥!
【解决方案2】:

尝试 OrderByDescending lambda 表达式:

void GetOrderedData()
{
    IEnumerable<MyObject> data = Enumerable.Range(1, 20).Select(x => new MyObject
    {
        id = x,
        name = "Name " + x
    });

    var ordereddata = data.Where(x => x.id > 6 && x.id < 14).OrderByDescending(x => x.id).Select(x => x.name);
}

public class MyObject
{
    public int id { get; set; }
    public string name { get; set; }
}

过滤+排序数据前后:

StackOverFlow 文章:OrderBy descending in Lambda expression?

【讨论】:

    【解决方案3】:

    您希望结果保持搜索数据的顺序。
    所以没有顺序,只要加入他们应该对你有用。

    给你一个例子

    class Program
    {
        static void Main(string[] args)
        {
            // searched data from db
            List<Person> people = new List<Person> { new Person(0, "Ben"), new Person(1, "Maria"), new Person(2, "Liza") };
            // search data
            List<string> nameList = new List<string> { "Liza", "Maria" };
    
            var result = nameList.Join(people, n => n, p => p.Name, (n, p) => p.Id).ToList();
        }
    }
    
    class Person
    {
        public Person(int id, string name)
        {
            Id = id;
            Name = name;
        }
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多