使用EF6在模型中定义一致的投影

Sea*_*een 5 c# asp.net-mvc entity-framework entity-framework-6

背景

  • 我们有一张桌子,我们称之为Files.
  • 我们对某些行的属性,如Name,CreatedDate等.
  • 我们有一个包含文件内容的blob列FileBytes.

所以我们的模型看起来类似于:

public class FileEntity
{
  public string Name { get; set; }
  public DateTime CreatedDate { get; set; }
  public byte[] FileBytes { get; set; }

  // many other fields, most of which we'd like to use
}
Run Code Online (Sandbox Code Playgroud)

目标

  • 在某些查询中,我们只关心是否FileBytesnull字节本身.
  • 我们希望能够查询并在我们的模型类中填充一个字段,比如说,FileHasBytes这是一个bool.
  • 我们希望这个字段只存在于我们的类中,以便我们可以在webapp中将它作为模型的一部分引用.
  • 我们希望能够在不从字段中提取完整字节的情况下查询此bool值.

我如何使用EF6在我的模型类上定义一个字段,该字段将根据表中的另一个字段进行一致投影,而不会拉出该字段的全部内容?

考虑选项/解决方法

  • 计算专栏:我们希望避免这种情况,因为它似乎没必要
  • 观点:我们也想避免这种情况,因为似乎没有必要为单个列进行此操作
  • 投影到一个新对象:这是可行的,但我们希望能够直接映射而不必每次都选择一个新对象,包括随之而来的所有字段.

pjo*_*obs 1

这并不理想,但我认为您可以添加一个返回 QueryExpression 的静态属性,例如

public static Expression<Func<FileEntity,bool>> FileHasBytes
{
   get { return ((c)=> c.FileBytes != null && SqlFunctions.DataLength(c.FileBytes)>0)
}
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过这段代码,所以对此持保留态度,所以请尝试彻底测试它。

我前段时间使用 Dynamic.linq 使用过类似的东西,但最近没有尝试过

dbContext.FileEntities.Where("FileHasBytes == true"),
Run Code Online (Sandbox Code Playgroud)