Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 如何使用EF CodeFirst进行搜索_Entity Framework_Code First - Fatal编程技术网

Entity framework 如何使用EF CodeFirst进行搜索

Entity framework 如何使用EF CodeFirst进行搜索,entity-framework,code-first,Entity Framework,Code First,目前,要使用EF CodeFirst和存储库模式进行搜索,根据用户对mvc搜索视图/页面上多个文本框的输入,我执行以下操作: public PagedList<Entity1> PlayerUserSearch(Entity1SearchParameters searchParameters, int? pageSize, int? startEntity, Func<Entity1, object> sortOrder, bool sortDesc) {

目前,要使用EF CodeFirst和存储库模式进行搜索,根据用户对mvc搜索视图/页面上多个文本框的输入,我执行以下操作:

    public PagedList<Entity1> PlayerUserSearch(Entity1SearchParameters searchParameters, int? pageSize, int? startEntity, Func<Entity1, object> sortOrder, bool sortDesc)
    {
        IQueryable<Entity1> query = from entities in this.DataContext.Entity1s.Include("Entity2List")
                                    where entities.Entity2List.Any()
                                    select entities;

        if (searchParameters.Entity2PrimaryKeyId.HasValue)
            query = query.Where(e => e.Id == searchParameters.Entity2PrimaryKeyId.Value);

        if (searchParameters.HasStats.HasValue)
        {
            if (searchParameters.HasStats.Value)
                query = query.Where(u => u.Entity2List.Any(e => e.Stat != null));
            else
                query = query.Where(u => u.Entity2List.Any(e => e.Stat == null));
        }

        if (searchParameters.Entity2OtherField.HasValue)
            query = query.Where(u => u.Entity2List.Any(e => e.Event.Entity2OtherField == searchParameters.Entity2OtherField));

        if (searchParameters.Entity2OtherField2.HasValue)
            query = query.Where(u => u.Entity2List.Any(e => e.Event.Entity2OtherField2 == searchParameters.Entity2OtherField2));

        if (searchParameters.Active.HasValue)
            query = query.Where(e => e.Active == searchParameters.Active.Value);

        return this.GetPageByStartEntity(pageSize.Value, startEntity.Value, query, sortOrder, sortDesc);
    }
public PagedList PlayerUserSearch(Entity1SearchParameters searchParameters、int?pageSize、int?Startenty、Func sortOrder、bool sortDesc)
{
IQueryable query=来自此.DataContext.Entity1s.Include(“Entity2List”)中的实体
where entities.Entity2List.Any()
选择实体;
if(searchParameters.Entity2PrimaryKeyId.HasValue)
query=query.Where(e=>e.Id==searchParameters.Entity2PrimaryKeyId.Value);
if(searchParameters.HasStats.HasValue)
{
if(searchParameters.HasStats.Value)
query=query.Where(u=>u.Entity2List.Any(e=>e.Stat!=null));
其他的
query=query.Where(u=>u.Entity2List.Any(e=>e.Stat==null));
}
if(searchParameters.Entity2OtherField.HasValue)
query=query.Where(u=>u.Entity2List.Any(e=>e.Event.Entity2OtherField==searchParameters.Entity2OtherField));
if(searchParameters.Entity2OtherField2.HasValue)
query=query.Where(u=>u.Entity2List.Any(e=>e.Event.Entity2OtherField2==searchParameters.Entity2OtherField2));
if(searchParameters.Active.HasValue)
query=query.Where(e=>e.Active==searchParameters.Active.Value);
返回此.GetPageByStartEntity(pageSize.Value、Startenty.Value、query、sortOrder、sortDesc);
}

问题是,每次我添加另一个检查某个字段的Entity1(Entity2)子级的语句时,它都会在生成的sql语句中加入一个新的“AND EXISTS”子句,因此它会对检查的每个不同字段重新执行EXISTS和检查表Entity2,而不是在查询中的实体上执行单个EXISTS,并检查附加到查询上的所有字段(即EntityOtherField1和EntityOtherField2)。我一直无法找到一种更好的方法来根据用户输入进行搜索,而不是不断检查输入是否存在(添加到搜索参数中),然后在当前查询中添加一个新的位置。有谁能告诉我有没有更好的方法?谢谢

我认为您需要的是使用规范模式

var spec = new specification<Entity2>(s => true);
if (searchParameters.HasStats.Value)
{
    spec = spec.And(e => e.Stat != null);
}

if (searchParameters.Entity2OtherField2.HasValue)
{
        spec = spec.And(e => e.Event.Entity2OtherField2 == searchParameters.Entity2OtherField2);
}

query = query.Where(u => u.Entity2List.Any(spec));  
var spec=新规范(s=>true);
if(searchParameters.HasStats.Value)
{
spec=spec.And(e=>e.Stat!=null);
}
if(searchParameters.Entity2OtherField2.HasValue)
{
spec=spec.And(e=>e.Event.Entity2OtherField2==searchParameters.Entity2OtherField2);
}
query=query.Where(u=>u.Entity2List.Any(spec));
或者,我相信您可以通过分离过滤器逻辑并使用
spec.IsStatisfiedBy
方法使其更加标准。
可以找到一个在实体框架上实现存储库/规范的好框架。

我认为我可能面临的更大问题是,使用Include确保Entity2返回与在同一实体/表上使用Any(exists)冲突。。。因此,即使我通过使用Entity2子项列表中的Any来限制我要查找的内容,使用Include仍然会导致连接到该表,该表将连接到该表中的所有记录,即使我不希望这样做。我如何才能得到它,从而不使用Any来执行exists,而只是将这些参数检查添加到current子句而不是exists?