【问题标题】:IN clause in Lambda expression against a List as referenceLambda 表达式中的 IN 子句针对列表作为参考
【发布时间】:2015-11-15 12:54:21
【问题描述】:

如何使用以列表为参考的 IN 子句?

List<PostOrcamentoServico> lOrcamentos = db.PostOrcamentoServico.Where(o => !o.Post.Usuarios.UsuEmail.Contains(User.Identity.Name) &&
                                                                       usuario.Clientes.Servicos.Contains(o.Servicos))
                                                                       .ToList();

在上面的例子中,o.Servicos是一个列表。

恢复:我想知道如何使用 IN,但是,使用列表作为参考:

myList.Contains(anotherList)

【问题讨论】:

  • LINQ to SQL in and not in 的可能重复项
  • @Arcturus 不,这不是我要找的......我想要一个列表作为参考,我使用的是 Lambda 而不是 Linq
  • lambda 语法和查询语法是可转换和可互换的。话虽如此,听起来您不仅要确保列表中包含单个值,而且要确保整个列表包含在更大的集合中。那是对的吗?您“想要一个列表作为参考”的断言并不是很清楚。
  • @CraigW。你是对的。如何改进我的标题?

标签: c# list lambda contains


【解决方案1】:

凭记忆,你可以这样做:

bool b = anotherList.All(x=> myList.Contains(x));

[编辑]这里是一个完整的测试样本:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<string> l1 = new List<string>();   

            l1.Add("toto");l1.Add("titi") ;l1. Add("tata") ;l1.Add("tutu") ;l1.Add("tete");

            List<string> l2 = new List<string>();
            l2.Add("toto"); l2.Add ("titi"); l2.Add ( "tata") ;

            if (l2.All(l1.Contains))
            {
                System.Console.WriteLine("OK");
            }
            else 
            {
                System.Console.WriteLine("KO");
            }

        }
    }
}

【讨论】:

  • {"无法创建类型为 'Servicili.Models.Servicos' 的常量值。此上下文仅支持原始类型或枚举类型。"}
  • 如果您在列表中使用自定义对象,您应该覆盖 Equals(Object obj) 以使 Contains 工作。
【解决方案2】:

使用这个:

bool contained = !subset.Except(superset).Any();

参考:

Determine if a sequence contains all elements of another sequence using Linq

【讨论】:

    【解决方案3】:

    正确答案是这样的:

    首先:我得到一个要比较的项目列表:

    var servicios = usuario.Clientes.Servicos.Select(s => s.SerId);
    

    然后我使用这个列表和值在我的 IN 中进行比较:

    List<PostOrcamentoServico> lOrcamentos = db.PostOrcamentoServico.Where(os => !os.Post.Usuarios.UsuEmail.Contains(User.Identity.Name)&&
                                                                                          os.Servicos.All(s => servicios.Contains(s.SerId))).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多