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

时间:2015-04-27 18:21:25

标签: c# asp.net-mvc entity-framework entity-framework-6

背景

  • 我们有一张桌子,我们称之为Files
  • 我们在该行上有某些属性,例如NameCreatedDate等。
  • 我们有一个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
}

目标

  • 在某些查询中,我们只关心FileBytesnull,而不关心字节本身。
  • 我们希望能够查询并填充我们的模型类中的字段,例如,FileHasBytesbool
  • 我们希望此字段仅存在于我们的类中,以便我们可以在webapp中将其作为模型的一部分引用。
  • 我们希望能够在不从字段中提取完整字节的情况下查询此bool值。

问题

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

考虑选项/解决方法

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

2 个答案:

答案 0 :(得分:2)

使用当前版本的EF6,您无法完全按照自己的意愿行事。

还有其他选择,但是对于所有这些选择,你必须对上述目标作出妥协。例如,使用具有计算属性的新投影类型,或者不查询计算值并在条件上明确,等等。

但是,使用像DelegateDecompiler之类的东西,可能就像你期望的那样拥有模型和查询。

有些事情:

def update
  your_model = YourModel.find(params[:id])

  # find the attributes with nil values:
  nil_attributes = your_model.attributes.select {|k,v| v.nil?}.keys.map(&:to_sym)

  # attributes that you allow to edit:
  allowed_attributes = [:title, :description, :size]

  # tell rails which are the allowed modifications:
  allowed_params = params.require(:your_model).permit(*(allowed_attributes - nil_attributes))

  # save the changes:
  your_model.update_attributes(allowed_params)

  # ...
end

在您的查询中,您将使用[Computed] public bool HasFileBytes { get { return FileBytes != null; } } 调用来翻译:

.Decompile()

使用Linq.Translations可能是另一种类似的选择。

来源http://www.daveaglick.com/posts/computed-properties-and-entity-framework

答案 1 :(得分:1)

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

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

我没有尝试过这段代码,所以请尝试使用盐,所以请尝试彻底测试。

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

dbContext.FileEntities.Where("FileHasBytes == true"),