C# EF Core 2、.NET Core 2:如何使用IQueryable查询同一列中的多个条件<;T>;?
我有一个类似于下图的数据库表 我将传递用户ID和2个字符串。例如:userId:1,key1:h1,key2:h2 指向具有类似签名的APiC# EF Core 2、.NET Core 2:如何使用IQueryable查询同一列中的多个条件<;T>;?,c#,entity-framework,asp.net-core,ef-core-2.2,C#,Entity Framework,Asp.net Core,Ef Core 2.2,我有一个类似于下图的数据库表 我将传递用户ID和2个字符串。例如:userId:1,key1:h1,key2:h2 指向具有类似签名的APi Public List<T> CheckValuesForUser(string userId, string key1, string key2) Public List checkvaluesfourser(字符串userId、字符串key1、字符串key2) 我需要检查特定的userid1是否同时具有h1和h2值。如果用户没有这两个
Public List<T> CheckValuesForUser(string userId, string key1, string key2)
Public List checkvaluesfourser(字符串userId、字符串key1、字符串key2)
我需要检查特定的userid1是否同时具有h1和h2值。如果用户没有这两个键,那么查询应该返回null
我试过下面的问题
context.tableName.where(i=>i.value.Equals(“h1”)和&i.value.Equals(“h2”)
——这不返回任何内容。我假设对每一行执行这个谓词Context.tableName.Where(i=>newstring[]{Key1,Key2}.Contains(i.Value))
--即使用户没有Key2的值,也会返回一个值。如果用户没有两个密钥,我需要得到一个空结果var list1=Context.tableName.Where(i=>i.Value.Equals(key1)).toList();
var list2=Context.tableName.Where(i=>i.Value.Equals(Key2)).toList();
如果(list1.Count>0&&list2.Count>0)list1.AddRange(list2)代码>
有人能帮我找到更好的解决办法吗?我使用的是Asp.Net Core 2.2,因为h1和h2条目是单独的记录,所以需要分别检查这两个值
// Group the records by the expected UserId
var groupedRecords = context
.TableName
.Where(t => t.UserId == userId)
.GroupBy(t => t.UserId);
// Ensure both the required records exist within the grouping
var hasRequiredRecords = groupedRecords.Any(i => i.Value.Equals("h1"))
&& Any(i => i.Value.Equals("h2"))
// Now that you know you have the required values, return them
return groupedRecords.Where(i => i.Value.Equals("h1") && i.Value.Equals("h2");
最后一行将仅返回作为单个
列表提供的用户ID
的两条记录,其值为h1
和h2
。您可以尝试使用此代码获得所需的:
string[] keys = new string[] { key1, key2 };
var result = (from m in context.UserInfo
where m.UserId == userId && keys.Any(name => name.Equals(m.Value)) select m).ToList().Count < keys.Count() ? null :
(from m in context.UserInfo where m.UserId == userId && keys.Any(name => name.Equals(m.Value)) select m).ToList();
string[]keys=新字符串[]{key1,key2};
var result=(来自context.UserInfo中的m)
其中m.UserId==UserId&&keys.Any(name=>name.Equals(m.Value))选择m.ToList().Countname.Equals(m.Value))选择m);
当条件不满足时,结果接收为null,如果满足,则将相应的数据集返回到结果。您可以尝试Context.tableName.Where(i=>newstring[]{Key1,Key2}.All(x=>x==i.Value))
它可以工作,但实际上我需要这两条记录。所以我要把它们放在两个变量中合并结果。。当我在IQueryable上使用concat时,我遇到了一个异常。@Anish我已经更新了我的答案,以返回您期望的格式的项目。