কোনও অনুসন্ধানের সাথে ফিল্টার করার আসল কোন সহজ উপায় নেই। তবে আমি কার্যকারিতাটির প্রতিলিপি ঘনিষ্ঠভাবে নিয়ে এসেছি তবে দয়া করে আমার সমাধানের জন্য কয়েকটি জিনিস নোট করুন।
এই সমাধানগুলি আপনাকে। নেট-কোরের প্রাথমিক কীটি না জেনারিকভাবে ফিল্টার করতে দেয়
অনুসন্ধানটি মৌলিকভাবে পৃথক কারণ এটি ডাটাবেস অনুসন্ধানের আগে ট্র্যাকিংয়ে উপস্থিত থাকলে সত্তাটি গ্রহণ করে।
অতিরিক্তভাবে এটি কোনও অবজেক্ট দ্বারা ফিল্টার করতে পারে যাতে ব্যবহারকারীর প্রাথমিক কীটি জানতে না হয়।
এই সমাধানটি সত্ত্বা ফ্রেমওয়ার্ক কোরের জন্য।
- এটি প্রসঙ্গে অ্যাক্সেস প্রয়োজন
এখানে যুক্ত করার জন্য কিছু এক্সটেনশন পদ্ধতি রয়েছে যা আপনাকে প্রাথমিক কী দ্বারা ফিল্টার করতে সহায়তা করবে
public static IReadOnlyList<IProperty> GetPrimaryKeyProperties<T>(this DbContext dbContext)
{
return dbContext.Model.FindEntityType(typeof(T)).FindPrimaryKey().Properties;
}
//TODO Precompile expression so this doesn't happen everytime
public static Expression<Func<T, bool>> FilterByPrimaryKeyPredicate<T>(this DbContext dbContext, object[] id)
{
var keyProperties = dbContext.GetPrimaryKeyProperties<T>();
var parameter = Expression.Parameter(typeof(T), "e");
var body = keyProperties
// e => e.PK[i] == id[i]
.Select((p, i) => Expression.Equal(
Expression.Property(parameter, p.Name),
Expression.Convert(
Expression.PropertyOrField(Expression.Constant(new { id = id[i] }), "id"),
p.ClrType)))
.Aggregate(Expression.AndAlso);
return Expression.Lambda<Func<T, bool>>(body, parameter);
}
public static Expression<Func<T, object[]>> GetPrimaryKeyExpression<T>(this DbContext context)
{
var keyProperties = context.GetPrimaryKeyProperties<T>();
var parameter = Expression.Parameter(typeof(T), "e");
var keyPropertyAccessExpression = keyProperties.Select((p, i) => Expression.Convert(Expression.Property(parameter, p.Name), typeof(object))).ToArray();
var selectPrimaryKeyExpressionBody = Expression.NewArrayInit(typeof(object), keyPropertyAccessExpression);
return Expression.Lambda<Func<T, object[]>>(selectPrimaryKeyExpressionBody, parameter);
}
public static IQueryable<TEntity> FilterByPrimaryKey<TEntity>(this DbSet<TEntity> dbSet, DbContext context, object[] id)
where TEntity : class
{
return FilterByPrimaryKey(dbSet.AsQueryable(), context, id);
}
public static IQueryable<TEntity> FilterByPrimaryKey<TEntity>(this IQueryable<TEntity> queryable, DbContext context, object[] id)
where TEntity : class
{
return queryable.Where(context.FilterByPrimaryKeyPredicate<TEntity>(id));
}
একবার আপনার এই এক্সটেনশন পদ্ধতিগুলি পরে আপনি ফিল্টার করতে পারেন:
query.FilterByPrimaryKey(this._context, id);