C# 在各种列中进行搜索的最易维护的方法
表中有一列类别,其中包含表示属性、汽车等的整数 下面显示的每个类别都有不同的兴趣列,因此搜索属性的关键字将集中在PropertyType、State、County和NoOfBaths的列上;而搜索汽车的关键词将集中在品牌、型号、年份等方面 所有条目在所有列中都有数据,但对于不同的类别,数据有时可能有稍微不同的含义。例如,PropertyType列保存汽车的CarType数据和其他车辆的ItemType数据,但这些列仅在搜索属性时才有意义 属性C# 在各种列中进行搜索的最易维护的方法,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,表中有一列类别,其中包含表示属性、汽车等的整数 下面显示的每个类别都有不同的兴趣列,因此搜索属性的关键字将集中在PropertyType、State、County和NoOfBaths的列上;而搜索汽车的关键词将集中在品牌、型号、年份等方面 所有条目在所有列中都有数据,但对于不同的类别,数据有时可能有稍微不同的含义。例如,PropertyType列保存汽车的CarType数据和其他车辆的ItemType数据,但这些列仅在搜索属性时才有意义 属性 属性类型, 位置状态, 位置县, 洗澡次数 汽车 制
属性类型,
位置状态,
位置县,
洗澡次数 汽车
制造,
型号,
年份,
位置状态 其他人
项目名称,
制造,
颜色,
位置状态 出于性能原因,感兴趣的列被限制为四列。用户界面中只使用一个搜索文本框,就像谷歌一样。在启动查询之前,用于预先识别用户搜索类别的算法具有可接受的98%准确率。该算法还可以很好地猜测颜色、州、县等。 该网站最初是一个使用c#、实体框架和SQL server开发的小型广告网站 因为它被认为是一个小项目,所以我想我可以通过LinqTo实体完成它。使用if语句消除空字段,它们是每个类别的有限数量的查询(2到4的幂) 例1 还有一些查询帮助的列表 其中,在组成where子句之前检查空值 当我完成的时候,我不确定像这样的小项目是否值得这样的逻辑,尽管它看起来更加灵活和可维护。可以在不影响代码的情况下更改感兴趣的列 问题是,是否有更简单的方法来实现这一点 其次,为什么linq中没有一个'Ignorable()'函数,以便在比较的值为null或空时可以忽略where子句的给定部分 修改过的
var results = context.Items.Where(m=>m.make.Ignorable() == make &&
m.model.Ignorable() == model && m.year.Ignorable() ==year &&
m.state.Ignorable() == state);
var results = context.Items.Where(m=>m.make ¬== make && m.model ¬== model
&& m.year ¬==year && m.state ¬== state);
或者是一个符号,比如说“,”,达到了同样的效果
修改过的
var results = context.Items.Where(m=>m.make.Ignorable() == make &&
m.model.Ignorable() == model && m.year.Ignorable() ==year &&
m.state.Ignorable() == state);
var results = context.Items.Where(m=>m.make ¬== make && m.model ¬== model
&& m.year ¬==year && m.state ¬== state);
…我认为在特定类中使用一个
重写的Equals()
方法更容易维护。因此,属性中的任何更改都不需要改变Linq查询。让我在一个示例类的帮助下解释这一点,让它成为类<代码> CARS < /Cord>考虑类的定义将是这样的:
public class Cars
{
// Properties
public string Make { get; set; }
public string Model { get; set; }
public int Year { get; set; }
public string Location_State { get; set; }
// overrided Equals method definition
public override bool Equals(object obj)
{
return this.Equals(obj as Cars);
}
public bool Equals(Cars other)
{
if (other == null)
return false;
return (this.Make == other.Make) &&
(this.Model == other.Model) &&
(this.Year == other.Year) &&
(this.Location_State == other.Location_State);
}
}
context.Items.Where(m=> m.Equals(objCars));
现在,让objCars
成为您想要与上下文中的汽车进行比较的对象。项目
,然后您可以像这样格式化LINQ查询:
public class Cars
{
// Properties
public string Make { get; set; }
public string Model { get; set; }
public int Year { get; set; }
public string Location_State { get; set; }
// overrided Equals method definition
public override bool Equals(object obj)
{
return this.Equals(obj as Cars);
}
public bool Equals(Cars other)
{
if (other == null)
return false;
return (this.Make == other.Make) &&
(this.Model == other.Model) &&
(this.Year == other.Year) &&
(this.Location_State == other.Location_State);
}
}
context.Items.Where(m=> m.Equals(objCars));
注意:您可以在Equals
方法中给出N
个条件,这样您就可以避免每次在执行LINQ或甚至使用LINQ之前检查是否为null或空或其他任何情况。很容易对类进行属性更改,您只需要在overrieded方法中更改条件
var q = context.Items;
if (!string.IsNullOrEmpty(make))
{
q = q.Where(m => m.make == make);
}
if (!string.IsNullOrEmpty(model))
{
q = q.Where(m => m.model == model);
}
//. . .
var results = q.ToList();
查询可以在执行之前在多行中进行操作。参见Cars objCars=new Cars(){model=“favmodel”,year=“2017”,locationState=“mystate”};在这种情况下,objCars.make默认为null,并返回(this.make==other.make)&&…将返回make==null的汽车,而不是省略make测试作为返回(this.Model==other.Model)&&&(this.Year==other.Year)&(this.Location\u State==other.Location\u State);正如我已经说过的,您可以修改条件以获得更有效的比较。在使用EntityFramework之类的Linq2Entities系统时,您不能重载equals