Tie Entity Framework调用一个常见参数,例如UserId

时间:2015-08-01 14:51:48

标签: c# .net linq entity-framework entity-framework-6

我们正在创建一个使用Entity Framework的应用程序来处理特定于单个用户的数据。数据库支持无限用户,因此我们需要按UserId进行过滤。 SQL Server后端具有所有表的公共列(INT UserId)。对于数据库的每个查询,我们必须传递和评估一个UserId参数,例如LINQ等。有没有一种好的方法可以删除这些代码,以便所有查询自动传递一个更高级别的UserId集?例如,如果我想从UserId的数据库中获取GetFoo(),我可以让应用程序调用context.GetFoo()而不必将UserId作为参数传递?也许在创建上下文时,我们可以在该级别传递UserId吗?

2 个答案:

答案 0 :(得分:0)

您可以使用以下

在你的DbContext中,你可以定义一个像这样的静态属性

android {
compileSdkVersion 22
buildToolsVersion "21.1.2"

defaultConfig {
    applicationId "com.yourappname"
    minSdkVersion 22
    targetSdkVersion 22
    versionCode 1
    versionName "1"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-project.txt'), 'proguard-rules.pro'
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile project(':nameOfTheLibrary')
}

然后定义以下界面

public static int UserId;

然后您将通过上述public interface IUser { int UserId {get; set;} } 界面装饰UserId的所有实体

并在IUser内,您可以写下以下内容:

DbContext

你可以使用上面的代码如下

public static IQueryable<T> WhereUser<T>(this DbSet<T> query, Expression<Func<T, bool>> predicate) where T : class,IUser
{
    return query.Where(predicate).Where(t => t.UserId == UserId); 
}

希望这会对你有所帮助

答案 1 :(得分:0)

您可以使用此库:https://github.com/jcachat/EntityFramework.DynamicFilters

只需在需要按用户ID过滤的所有实体上实现具有userId的界面。

public interface IUserEntity
{
  int UserId {get; set;}
}

将userId传递给DbContext,然后传入OnModelCreating:

modelBuilder.Filter("UserId", (IUserEntity u) => u.UserId, _userId);