c# – 动态LINQ查询从数据库获取Field值

可能吗?
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;
}

要么

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

在这里,我传递Table_Name,Column_Name和Condition值(PK_val)以在特定条件(Id = Pk_val)内从Table_Name获取Column_Name.

可能吗??

解决方法

Is it possible??

是的.

首先,一些帮手:

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>,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));
}

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...