【问题标题】:Lambda expression for multiple Guids多个 Guid 的 Lambda 表达式
【发布时间】:2015-06-29 13:16:08
【问题描述】:

尝试创建 Lambda 表达式以从包含七个 Guid 值中的任何一个的数据库中选择记录。

当我尝试以下操作时:

searchedOpps = searchedOpps.Where(s => s.STAGEID == stageAGuid && stageAPlusGuid && //etc);

我得到一个Operator '&&' cannot be applied to operands of type 'bool' and 'System.Guid',与|| 相同(不确定我应该使用哪个或是否应该使用这些运算符中的任何一个)

如果我尝试:

searchedOpps = searchedOpps.Where(s => s.STAGEID == stageAGuid);
searchedOpps = searchedOpps.Where(s => s.STAGEID == stageAPlusGuid);

没有任何回报

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您必须重复变量名。 searchedOpps = searchedOpps.Where(s => 1stageAGuid || s.STAGEID == stageAPlusGuid || //etc)

标签: c# .net linq linq-to-sql


【解决方案1】:

如果你有一些带有 OR 运算符的键,你可以试试这个,在 C# 中是 ||,例如:

searchedOpps = searchedOpps.Where(s => s.STAGEID == stageAGuid 
                                    || s.STAGEID == stageAPlusGuid));

但是,如果您有一个键列表,您可以尝试使用Contains 方法,例如:

List<Guid> guids = /* get your keys from somewhere */;
searchedOpps = searchedOpps.Where(s => guids .Contains(s.STAGEID));

如果您使用 linq to database(linq-to-sql、entity-framework、nhibernate 等),它将生成一个带有 IN 运算符的查询,其中包含所有键。

【讨论】:

    【解决方案2】:

    在您的第二个示例中,您正在寻找具有STAGEID == stageAGuid AND STAGEID == stageAPlusGuid 的对象。没有得到任何结果也就不足为奇了。

    在您的第一个示例中,您只需重复要比较的键:

    searchedOpps = searchedOpps
                   .Where(s => s.STAGEID == stageAGuid 
                   || s.STAGEID == stageAPlusGuid [...]);
    

    按照您编写它的方式,编译器尝试通过“ORing”、bool(来自第一次比较)和GUID&amp;&amp; 之后的值)来获取 bool

    【讨论】:

      【解决方案3】:

      您需要“或”您的条件并指定每次比较。

      searchedOpps = searchedOpps.Where(s => s.STAGEID == stageAGuid || 
                                             s.STAGEID == stageAPlusGuid || //etc);
      

      请注意,连续调用Where 会将条件“与”在一起。

      searchedOpps = searchedOpps.Where(s => s.STAGEID == stageAGuid);
      searchedOpps = searchedOpps.Where(s => s.STAGEID == stageAPlusGuid);
      

      一样
      searchedOpps = searchedOpps.Where(s => s.STAGEID == stageAGuid && 
                                             s.STAGEID == stageAPlusGuid);
      

      【讨论】:

        【解决方案4】:

        您可以使用PredicateBuilder 类:

        var searchPredicate = PredicateBuilder.False<Songs>();
        
        searchPredicate = searchPredicate.Or(g=> g == stageAGuid);
        searchPredicate = searchPredicate.Or(g=> g == stageAPlusGuid);
        
        searchedOpps = searchedOpps.Where(searchPredicate);
        

        【讨论】:

          【解决方案5】:

          你没有说你使用什么系统来访问数据,所以我假设它是 EF 并且至少是 .NET 4。

          如果您正确编写查询,LINQ-to-Entities 会将其转换为 SQL“in”子句。查看此 MSDN 条目:

          http://blogs.msdn.com/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

          如果您要寻找 7 个不同的 guid,请执行以下操作:

          Guid[] myGuidList =
              { stageAGuid, stageAPlusGuid, anotherGuid, guid4, guid5, guid6, guid7, };
          
          var results = searchedOpps.Where(s => myGuidList.Contains(s.STAGEID)); 
          

          生成的 SQL 将如下所示:

          select * from searchedOpps where STAGEID in (<guid>, <guid>, <guid>...)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-06
            • 2010-12-17
            • 1970-01-01
            • 2019-10-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多