2016-08-30 31 views
1

我有以下属性的DB类:使用由计算属性过滤的实体框架从数据库中检索类的列表?

public string AwsS3Key { get; set; } 
public bool PendingS3Upload => !string.IsNullOrEmpty(AwsS3Key); 

我试图通过基于PendingS3Upload属性过滤拉从我的上下文数据的列表。不过,我得到以下错误:

The specified type member 'PendingS3Upload' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

我怎样才能提取数据从我的表,对于“计算”属性PendingS3Upload

回答

1

您可以标记你属性与[NotMapped]属性。虽然你将无法使用一些使用情况下,这是不可能的,由于大型数据集等

如果您需要查询这对ToList()AsEnumnerable()在数据库级别查询此,只在内存中数据库,然后假设你正在使用SQL Server,你可以使用计算列。

Computed Column Info

如果你想这是第一守则,那么你就得当你初始化数据库或者迁移到执行一些SQL。

ALTER TABLE dbo.TableName 
ADD PendingS3Upload AS (CAST(CASE WHEN AwsS3Key <> '' = 1 THEN 1 ELSE 0 END AS BIT)) 

然后改变你的类属性来

[DatabaseGenerated(DatabaseGenerationOption.Computed)] 
public bool PendingS3Upload { get; private set;} 

(我不记得,如果私定将工作)

+0

啊。我将如何去创建计算列,特别是从我的Code First方法? –

+0

@DanielBrown我已经更新了我的答案。 – SimonGates

0

LINQ不能将计算的属性转换为SQL语句,这就是为什么你会得到该错误。你有两个选择。您可以提取数据在本地使用ToList(),然后应用这样的过滤器:

var result = Context.YourClass.ToList().Where(c => c.PendingS3Upload).ToList(); 

,或者你可以转换逻辑的东西LINQ可以处理这样的:

var result = Context.YourClass.Where(c => !string.IsNullOrEmpty(c.AwsS3Key)).ToList(); 
+0

是否有可能对我来说,强制属性映射到数据库,然后继续过滤属性?你提到的两个选项都不可取。 –

相关问题