2015-08-26 80 views
6

是否有可能?動態LINQ查詢從數據庫中獲取字段值

Public String Get_Filed_By_Id(string table_Name,String Field_Name,string PK_val) 
{ 
    string strRes=""; 
    using(mydbcontext db=new mydbcontext()) 
    { 
     var x=db.table_Name.Where(p=>p.Id=PK_val).FirstOrDefault().Field_Name; 
     strRes=Convert.Tostring(x); 
    } 
return strRes; 
} 

OR

var x=(from o in db.table_Name where o.Id=PK_val select o.Field_Name).FirstOrDefault(); 

在這裏,我路過Table_NameColumn_Name和條件值(PK_val)在一定條件(Id=Pk_val)內獲取從Table_NameColumn_Name

是否有可能?

+0

好,如果你需要那種功能上首先想到的是反射(而不是內部的IQueryable) :var tableItem = db.table_Name.Where(p => p.Id = PK_val).FirstOrDefault(); var x = tableItem.GetType()。GetProperty(FieldName).GetValue(tabelItem,null); – Den

+0

你有沒有考慮過使用存儲庫模式? – Arash

+0

@Arashjo不,你能告訴我方式,做出答案嗎? –

回答

8

是否有可能?

是的。

首先,一些助手:

using System; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Reflection; 

namespace YourNamespace 
{ 
    internal static class DbHelpers 
    { 
     public static object GetColumnById(this object dbContext, string tableName, string columnName, object id) 
     { 
      var table = (IQueryable)dbContext.GetType().GetProperty(tableName).GetValue(dbContext, null); 
      var row = Expression.Parameter(table.ElementType, "row"); 
      var filter = Expression.Lambda(Expression.Equal(Expression.Property(row, "Id"), Expression.Constant(id)), row); 
      var column = Expression.Property(row, columnName); 
      var selector = Expression.Lambda(column, row); 
      var query = Call(Where.MakeGenericMethod(row.Type), table, filter); 
      query = Call(Select.MakeGenericMethod(row.Type, column.Type), query, selector); 
      var value = Call(FirstOrDefault.MakeGenericMethod(column.Type), query); 
      return value; 
     } 
     private static readonly MethodInfo Select = GetGenericMethodDefinition< 
      Func<IQueryable<object>, Expression<Func<object, object>>, IQueryable<object>>>((source, selector) => 
      Queryable.Select(source, selector)); 
     private static readonly MethodInfo Where = GetGenericMethodDefinition< 
      Func<IQueryable<object>, Expression<Func<object, bool>>, object>>((source, predicate) => 
      Queryable.Where(source, predicate)); 
     private static readonly MethodInfo FirstOrDefault = GetGenericMethodDefinition< 
      Func<IQueryable<object>, object>>(source => 
      Queryable.FirstOrDefault(source)); 
     private static MethodInfo GetGenericMethodDefinition<TDelegate>(Expression<TDelegate> e) 
     { 
      return ((MethodCallExpression)e.Body).Method.GetGenericMethodDefinition(); 
     } 
     private static object Call(MethodInfo method, params object[] parameters) 
     { 
      return method.Invoke(null, parameters); 
     } 
    } 
} 

,現在你的函數:

public string Get_Field_By_Id(string table_Name, string field_Name, string PK_val) 
{ 
    using (var db = new mydbcontext()) 
     return Convert.ToString(db.GetColumnById(table_Name, field_Name, PK_val)); 
} 
1

實際上EntityFramework實際上並不可能(據我所知)。如果您只需要名稱的字段,那麼您可以使用@ Den的建議解決方案。但是您也想將表名稱指定爲參數。所以我建議你使用標準的Sql Connector api,並用你提供的參數構建查詢字符串。

檢查this link使用標準的sql連接器API。

0

沒有,但以這種方式

Public String Get_Filed_By_Id(string table_Name,String Field_Name,string PK_val) 
{ 
    string strRes=""; 
    using(mydbcontext db=new mydbcontext()) 
    { 
     var x=db.table_Name.Where(p=>p.Id=PK_val).Select(b=>b.Field_Name).FirstOrDefault(); 
     strRes=Convert.Tostring(x); 
    } 
return strRes; 
} 
+0

不是要去工作,我試圖通過'Table_Name'和「FIELD_VALUE」作爲'Parameter' –

+0

然後使用查詢,像db.database.ExecuteSQLQuery或這樣的事情,這需要字符串(查詢)作爲參數。 – Lali

+0

我相信這種方式是可能的,但猜測它會很寬泛,但我想看到的方式。 –

1

我有這個問題太,我知道這是不是你想要什麼,你需要編寫更多的代碼但它比你想寫的要乾淨得多。
使用存儲庫模式
對於每個表,您應該有模型類和存儲庫類。
考慮這個代碼(從我的項目的一個驗證碼)
這是我的意見表(該帶或不帶導航屬性可以是任何東西)

public sealed class Comment 
{ 
    public string CommentText { get; set; } 
    public DateTime PostDate { get; set; } 
    public int PostId { get; set; } 
    public int? PageId { get; set; } 
    public Page Page { get; set; } 
    public User User { get; set; } 
    public string UserId { get; set; } 
    public int? ParentId { get; set; } 
    public Comment[] ChildComments { get; set; } 
} 

RepositoryComment

public sealed class CommentRepository : BaseRepository<Comment> 
{ 
    public CommentRepository(BabySitterContext context) 
     : base(context) 
    { 
    } 
} 

和基類,您發送您的查詢與表名稱(這裏模型)和字段(您可以擴展clas的更多功能)

public class BaseRepository<T> where T : class 
{ 
    protected BabySitterContext Context; 
    private readonly PluralizationService _pluralizer = PluralizationService.CreateService(CultureInfo.GetCultureInfo("en")); 
    public BaseRepository(BabySitterContext context) 
    { 
     this.Context = context; 
    } 
    public bool Add(T t) 
    { 
     Context.Set<T>().Add(t); 
     Context.SaveChanges(); 
     return true; 
    } 
    public bool Update(T t) 
    { 
     var entityName = GetEntityName<T>(); 

     object originalItem; 
     var key = ((IObjectContextAdapter)Context).ObjectContext.CreateEntityKey(entityName, t); 
     if (((IObjectContextAdapter)Context).ObjectContext.TryGetObjectByKey(key, out originalItem)) 
     { 
      ((IObjectContextAdapter)Context).ObjectContext.ApplyCurrentValues(key.EntitySetName, t); 
     } 
     Context.SaveChanges(); 
     return true; 
    } 
    public void Attach(T t) 
    { 
     if (t == null) 
     { 
      throw new ArgumentNullException("t"); 
     } 

     Context.Set<T>().Attach(t); 
     Context.SaveChanges(); 
    } 
    public void Remove(T t) 
    { 
     if (t == null) 
     { 
      throw new ArgumentNullException("t"); 
     } 
     Context.Set<T>().Remove(t); 
     Context.SaveChanges(); 
    } 
    public IEnumerable<T> Get(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "") 
    { 
     IQueryable<T> query = Context.Set<T>(); 

     if (filter != null) 
     { 
      query = query.Where(filter.Expand()); 
     } 

     foreach (var includeProperty in includeProperties.Split 
      (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      query = query.Include(includeProperty); 
     } 

     if (orderBy != null) 
     { 
      return orderBy(query).ToList(); 
     } 
     else 
     { 
      return query.ToList(); 
     } 
    } 
    private string GetEntityName<TEntity>() where TEntity : class 
    { 
     return string.Format("{0}.{1}", ((IObjectContextAdapter)Context).ObjectContext.DefaultContainerName, _pluralizer.Pluralize(typeof(TEntity).Name)); 

    } 

    public virtual IEnumerable<T> GetByBusinessKey(T entity) 
    { 
     return null; 
    } 
}  

對於任何其他表只是讓模型類和reposiotry然後inherite從基類

使用代碼

var context = new BabySitterContext(); 
var _commentRepository = new CommentRepository(context); 
var comment = _commentRepository.Get(x => x.PostId == id).FirstOrDefault();