返回在对象内部过滤的列表

时间:2018-04-16 21:15:39

标签: c# entity-framework

修改

整个例子:

我有一个具有文件列表的对象人,这些文件有类型,因为不是在数据库中创建具有相同数据但仅更改表的命名的几个表,而是决定创建类型字段单独的文件类型。所以我有一个唯一的文件表,由列type_file键入。

根据解释,此时我需要恢复只有附件类型文件的人,所以我需要过滤来自银行的列表,以便不显示该人的其他类型的文件

我有一个授权人,就像以下代码:

public class Person(){
public string name {get; set;}
public int id {get; set;}
public List<File> file {get; set;}
}

并提交文件:

public class File(){
  public string name {get; set;}
  public int id {get; set;}
  public int extension {get; set;}
  public int type_file {get; set;}
}

文件有树型: 文献, 证书和 附件。 OBS:文件类型是枚举。

简而言之,我想返回包含文件列表的person对象,但我希望此列表仅包含附件类型的文件。

OBS :我使用EF6和VS2017的第一版。我没有在这里添加包含,因为我觉得没必要。

此代码我使用:

//returning a iqueryable
var t = service.getAll<person>()
   .Where(x => x.id == id)
   .Where(y => y.files.Any(l => l.type_file == 1))
   .FirstOrDefault();

//result is the same.... object filtered by list, and not object with list filtered
var t = service.getAll<person>()
   .Where(x => x.id == id)
   .Where(y => y.files.Any(l => l.type_file == 1))
   .ToList();

此代码不返回已过滤的列表..仅按列表过滤对象。

3 个答案:

答案 0 :(得分:0)

您正在使用FirstOrDefault,它将返回可枚举的第一个对象(如果列表为空,则返回null *)。如果您需要列表,请删除此方法调用并改为添加ToList

var t = service.getAll<person>()
               .Where(x => x.id == id)
               .Where(y => y.files.Any(l => l.type_file == 1))
               .ToList();

*更准确的答案是,它将返回IEnumerable所代表的任何类型的默认值。对于值类型,这将是该类型的默认值(例如,int为0,bool为false,等等)。对于参考类型,这将是null

答案 1 :(得分:0)

由于您没有提供Minimal, Complete and Verifiable Example,我已创建了您的方案的简单表示:

static List<Person> GetAllPersons()
{
    var ret = new List<Person>(new [] 
                            { 
                                new Person(){ Id = 10 }, 
                                new Person(){ Id = 4 },
                                new Person(){ Id = 8 }
                            });

    var rnd = new Random();

    foreach(var person in ret)
        for(int i = 0; i <3; i++)
            person.Files.Add(new File() { FileType = rnd.Next(1,3) , Name= "File " + (i + 1).ToString() });

    return ret;
}

class Person
{
    public int Id { get; set; }
    public List<File> Files { get;set; }

    public Person()
    {
        Files = new List<File>();
    }
}

class File
{
    public int FileType { get; set; }
    public string Name { get; set; }
}

如果我理解您的需求,您希望更改与您的限制相匹配的第一个Files的{​​{1}}属性。

这将是这样的:

Person

This complete example is available on dotnetfiddle

但可以肯定的是,这种逻辑毫无意义,并且在所有可能的方面都是错误的。我非常有信心,你所面临的问题是从你令人困惑的逻辑中提出来的,而且它甚至会变得非常糟糕。

我建议你在通过这种危险的方式之前组织你的逻辑。

答案 2 :(得分:0)

这是我解决这个问题的方法,谢谢你的帮助。

        //var person is DTO
        var person= base.Get(id);
        var list = new List<FileDTO>();
        person.file.ForEach(delegate (FileDTO obj)
        {
            if (obj.type_file== (int)TypeFile.Attachment)
            {
                obj.archive = null;
                list.Add(obj);
            }
        });
        person.file = list;
        return person;