Linq包含和Where子句

时间:2017-02-08 14:44:52

标签: c# entity-framework linq

我有以下linq声明:

var result = _context.Settings
                     .Include(x => x.Files)
                     .Where(y => y.Files.Where(f => f.SettingFile == true))
                     .Select(z => z.Deleted == null)
                     .ToList();

我想要做的是从表中获取所有设置。我还想包含files-table并获取具有SettingFile true的所有文件。但我一直得到以下错误:

  

无法将IEnumerable类型(UploadedFile)转换为bool。

这是我的UploadedFile模型:

[Required]
public string FileName { get; set; }
[Required]
public string FileExtension { get; set; }
[Required]
public byte[] FileContent { get; set; }

public Guid? FormAnswerId { get; set; }
public Guid? LicenseHolderId { get; set; }
public Guid? CaseId { get; set; }
public Guid? ErrandId { get; set; }
public bool SettingFile { get; set; }

这是我的设置模型:

    public class Setting : ModelBase
{
    public string Key { get; set; }
    public string DisplayName { get; set; }
    public string DisplayText { get; set; }
    public string DisplayTab { get; set; }
    public string Value { get; set; }
    public string Type { get; set; }
    public virtual ICollection<UploadedFile> Files { get; set; }
}

模型库:

public abstract class ModelBase : EntityBase
{
   public DateTime? Deleted {get; set;}
}

我的查询错误是什么?

1 个答案:

答案 0 :(得分:2)

我不太明白你想要完成什么,但我可以解释你的问题。

Where()子句是Func<T, bool>。您传入T的实例,并返回bool值。

在这一行.Where(y => y.Files.Where(f => f.SettingFile == true))中,您返回的IEnumerable<T>应该返回bool。这就是造成错误的原因。您可以通过将y.Files.Where(f => f.SettingFile == true)更改为y.Files.Any(f => f.SettingFile)y.Files.All(f => f.SettingFile)来解决错误。但是,我不认为这是你想要完成的事情。

修改:由于您尝试获取具有SettingFile == true的所有设置,请执行以下操作:

_context.Settings
        .Include(x => x.Files.Where(f => f.SettingFile == true))
        .Select(z => z.Deleted == null)
        .ToList();

编辑:在评论中进一步沟通后,您说您想要一个Setting的集合。所以你只需要删除.Select(x => z.Deleted == null),你应该是金色的。

_context.Settings
        .Include(x => x.Files.Where(f => f.SettingFile == true))
        .ToList();

我不知道您的使用案例,但建议添加另一个Where条件,以排除任何Settings不具有Files的情况SettingFiletrue

_context.Settings
        .Include(x => x.Files.Where(f => f.SettingFile == true))
        .Where(x => x.Files.Any(f => f.SettingFile == true))
        .ToList();