修改
整个例子:
我有一个具有文件列表的对象人,这些文件有类型,因为不是在数据库中创建具有相同数据但仅更改表的命名的几个表,而是决定创建类型字段单独的文件类型。所以我有一个唯一的文件表,由列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();
此代码不返回已过滤的列表..仅按列表过滤对象。
答案 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;