多个Guids的Lambda表达式

时间:2015-06-29 13:16:09

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

尝试创建一个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);

什么都不返回

有人可以帮我这个吗?

5 个答案:

答案 0 :(得分:7)

如果您使用||运算符的某些键(在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)); 方法,样本:

IN

如果您正在使用linq到数据库(linq-to-sql,entity-framework,nhibernate等),它将使用var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2); 运算符生成一个查询,并为您提供所有键。

答案 1 :(得分:6)

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

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

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

编写它的方式,编译器尝试通过'bool'OR(来自第一次比较)和boolGUID来获得&& OR之后的值。

答案 2 :(得分:2)

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

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);

答案 3 :(得分:2)

您可以使用PredicateBuilder类:

var searchPredicate = PredicateBuilder.False<Songs>();

searchPredicate = searchPredicate.Or(g=> g == stageAGuid);
searchPredicate = searchPredicate.Or(g=> g == stageAPlusGuid);

searchedOpps = searchedOpps.Where(searchPredicate);

答案 4 :(得分:2)

您不会说出您正在使用哪种系统进行数据访问,因此我将假设它的EF和至少.NET 4。

如果您正确编写查询,LINQ-to-Entities会将其转换为SQL&#34; in&#34;条款。看看这个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[] 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>...)