C# Linq to Entities:其中In具有1个值和多个列
我知道在sql中,您可以这样做C# Linq to Entities:其中In具有1个值和多个列,c#,sql,linq-to-entities,C#,Sql,Linq To Entities,我知道在sql中,您可以这样做 WHERE 'val' IN (field1, field2, field3, field4, ...) 我想知道是否有一种方法可以使用Linq来做类似的事情?我现在唯一能想到的就是创建一个巨大的“或”语句,列出我想搜索的字段,如下所示 .where(m => m.field1.Contains('val') || m.field2.Contains('val') || m.field3.Contains('val') ||
WHERE 'val' IN (field1, field2, field3, field4, ...)
我想知道是否有一种方法可以使用Linq来做类似的事情?我现在唯一能想到的就是创建一个巨大的“或”语句,列出我想搜索的字段,如下所示
.where(m =>
m.field1.Contains('val') ||
m.field2.Contains('val') ||
m.field3.Contains('val') ||
m.field4.Contains('val'));
有没有更干净的方法来编写此搜索,或者我的搜索结果是否与它一样好?您可以这样做
.Where(f => new string[] { f.field1, f.field2, f.field3 }.Any(s => s.Contains("val")));
具有您发布的代码的行为,或
.Where(f => new string[] { f.field1, f.field2, f.field3 }.Contains("val"));
检查是否相等
但我不能说这是否是一个关于性能的好主意
下面是一个代码示例:
public class ClassWithFields
{
public int Id { get; set; }
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 {get;set;}
}
public class Program
{
public static void Main()
{
var listFields = new List<ClassWithFields>()
{
new ClassWithFields { Id = 1, Field1 = "val", Field2 = "qewr", Field3 = "asdqw" },
new ClassWithFields { Id = 2, Field1 = "asdf", Field2 = "asdd", Field3 = "asdqw" },
new ClassWithFields { Id = 3, Field1 = "asdf", Field2 = "qewr", Field3 = "qwvaleqwe" }
};
var containsVal = listFields.Where(f => new string[] { f.Field1, f.Field2, f.Field3 }.Any(s => s.Contains("val")));
var equalsVal = listFields.Where(f => new string[] { f.Field1, f.Field2, f.Field3 }.Contains("val"));
}
}
带有字段的公共类
{
公共int Id{get;set;}
公共字符串字段1{get;set;}
公共字符串字段2{get;set;}
公共字符串字段3{get;set;}
}
公共课程
{
公共静态void Main()
{
var listFields=新列表()
{
新类包含字段{Id=1,Field1=“val”,Field2=“qewr”,Field3=“asdqw”},
新类包含字段{Id=2,Field1=“asdf”,Field2=“asdd”,Field3=“asdqw”},
新类包含字段{Id=3,Field1=“asdf”,Field2=“qewr”,Field3=“qwvaleqwe”}
};
var containsVal=listFields.Where(f=>newstring[]{f.Field1,f.Field2,f.Field3}.Any(s=>s.Contains(“val”));
var equalsVal=listFields.Where(f=>newstring[]{f.Field1,f.Field2,f.Field3}.Contains(“val”);
}
}
您可以在运行它,因为在SQL上检查相等性,而在SQL上检查包含类似于。此外,您使用'而不是'包围字符串val,'仅适用于单个字符
假设您试图在任何属性具有特定值的情况下检索“m”,则必须使用反射:
首先创建一个方法来循环对象并匹配所需的值
public bool FieldSearch(object a, string b)
{
//Get the type of your object, to loop through its properties
Type t = a.GetType();
//loop and check (the loop stops once the first property that matches has been found!)
foreach(PropertyInfo p in t.GetProperties())
{
if(p.GetValue(a).ToString()==b)
{
return true;
}
}
return false;
}
使用GetProperties()时要小心,您可能需要添加BidingAttribute,因为它检索每个(公共)属性
现在,只需在linq上使用新的bool方法即可:(这不是一个根据上下文确定性能的好主意)
尽管所有这些都是可能的,但您可能会遇到架构问题,因为您将很快失去引用,因为此linq查询将返回在任何字段上具有该值的任何对象;而不指定哪个字段
可能有更好的方法来做你想做的事情。看看这是否是一个可能的解决方案…那篇文章不涉及实体上的多个字段,因为“类型”只是实体上的一个字段。这不是工作方式。它进行等式比较,而不是
包含。
.where(m => FieldSearch(m,"val"))