Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在各种列中进行搜索的最易维护的方法_C#_Sql Server_Entity Framework_Linq - Fatal编程技术网

C# 在各种列中进行搜索的最易维护的方法

C# 在各种列中进行搜索的最易维护的方法,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,表中有一列类别,其中包含表示属性、汽车等的整数 下面显示的每个类别都有不同的兴趣列,因此搜索属性的关键字将集中在PropertyType、State、County和NoOfBaths的列上;而搜索汽车的关键词将集中在品牌、型号、年份等方面 所有条目在所有列中都有数据,但对于不同的类别,数据有时可能有稍微不同的含义。例如,PropertyType列保存汽车的CarType数据和其他车辆的ItemType数据,但这些列仅在搜索属性时才有意义 属性 属性类型, 位置状态, 位置县, 洗澡次数 汽车 制

表中有一列类别,其中包含表示属性、汽车等的整数

下面显示的每个类别都有不同的兴趣列,因此搜索属性的关键字将集中在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