Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用EF6在模型中定义一致投影 背景 我们有一个表,我们称之为文件 我们在行上有某些属性,例如Name,CreatedDate,等等 我们有一个blob列,其中包含文件的内容,FileBytes_C#_Asp.net Mvc_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 使用EF6在模型中定义一致投影 背景 我们有一个表,我们称之为文件 我们在行上有某些属性,例如Name,CreatedDate,等等 我们有一个blob列,其中包含文件的内容,FileBytes

C# 使用EF6在模型中定义一致投影 背景 我们有一个表,我们称之为文件 我们在行上有某些属性,例如Name,CreatedDate,等等 我们有一个blob列,其中包含文件的内容,FileBytes,c#,asp.net-mvc,entity-framework,entity-framework-6,C#,Asp.net Mvc,Entity Framework,Entity Framework 6,因此,我们的模型类似于: 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 } 目标 在某些查询中,我们只关心FileBytes是否为null,

因此,我们的模型类似于:

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
}
目标
  • 在某些查询中,我们只关心
    FileBytes
    是否为
    null
    ,而不关心字节本身
  • 我们希望能够在模型类中查询并填充一个字段,例如,
    FileHasBytes
    ,它是一个
    bool
  • 我们希望此字段仅存在于我们的类中,以便我们可以在webapp中将其作为模型的一部分引用
  • 我们希望能够查询此bool值,而无需从字段中提取完整字节
问题: 如何使用EF6在我的模型类上定义一个字段,该字段将基于表中的另一个字段进行一致的投影,而不提取该字段的全部内容

考虑过的选择/解决办法
  • 计算列:我们希望避免这种情况,因为它似乎没有必要
  • 查看:我们也希望避免出现这种情况,因为似乎没有必要为单个列转到这个
  • 投影到一个新对象:这是可行的,但我们希望能够直接映射,而无需每次选择一个新对象,包括它附带的所有字段

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

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

在EF6的当前版本中,您不能完全按照自己的要求进行操作

还有其他选择,但有了所有这些,你必须在上述目标上做出妥协。例如,使用具有computed属性的新投影类型,或者不查询计算值,而是显式显示条件,等等

但是,使用类似的方法可能会使模型和查询与您期望的一样

大致如下:

[Computed]
public bool HasFileBytes
{
    get { return FileBytes != null; }
}
在查询中,您可以使用
.Decompile()
调用将其转换为:

var query = ctx.Files
    .Where(x => x.HasFileBytes)
    .Decompile();
使用可能是另一个类似的选择


源:

表拆分,然后您可以使用具有byte[]属性的FileContent类和另一个类。@George感谢您的快速响应!同意,但我们的问题是,我们希望在模型类上放置一个属性,类似于
FileHasBytes
,它需要
FileBytes
来计算
FileBytes
是否为null。当拉取
文件字节时,它会将它们全部拉取,这是我们希望避免的。我想将
IsNull(FileBytes)
基本上投影到一个字段中。计划为“未来”。您必须进行表拆分。@Alex我们已经在进行表拆分了。我们试图做的是在模型类中添加一个名为
IsFileNull
的字段,并将其映射到
FileBytes
是否为null,而无需提取所有字节本身。所以我们需要从EF linq查询中映射这个字段,我们希望有一种基于约定的方法来映射这个字段,而不必让我们的查询选择一个新的结果对象投影,该投影查看
FileBytes==null
,因为我们还需要投影25个以上的其他字段。
var query = ctx.Files
    .Where(x => x.HasFileBytes)
    .Decompile();