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值,而无需从字段中提取完整字节
- 计算列:我们希望避免这种情况,因为它似乎没有必要
- 查看:我们也希望避免出现这种情况,因为似乎没有必要为单个列转到这个
- 投影到一个新对象:这是可行的,但我们希望能够直接映射,而无需每次选择一个新对象,包括它附带的所有字段
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();