C# Linq 列名作为变量
本文关键字:变量 Linq | 更新日期: 2023-09-27 18:31:00
我有一个表,我想在其中对变量列进行查询。喜欢:
private void query(string column, string value) {
using (var db = new myDB()) {
var s1 = (from c in db.Components
where (**column** == **value**)
select new {c.id, **column**});
}
}
假设我想寻找供应商,那么它会像:
var s1 = (from c in db.Components
where (c.supplier == "abc")
select new {c.id, c.supplier});
有没有办法将列名作为变量传递?
我想这个例子可能很有用。
void BindGridTypeSafe()
{
NorthwindDataContext northwind = new NorthwindDataContext();
var query = from p in northwind.Products
where p.CategoryID == 3 && p.UnitPrice > 3
orderby p.SupplierID
select p;
GridView1.DataSource = query;
GridView1.DataBind();
}
void BindGridDynamic()
{
NorthwindDataContext northwind = new NorthwindDataContext();
var query = northwind.Products
.Where("CategoryID = 3 AND UnitPrice > 3")
.OrderBy("SupplierID");
GridView1.DataSource = query;
GridView1.DataBind();
}
一个不错的方法是使用动态 Linq
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
像这样:
var s1 = (from c in db.Components
where(column + "=" + value)
select new {c.id, **column**});
简短的回答是添加库System.Linq.Dynamic作为参考,并执行以下操作:
string columnName = "Supplier";
var s1 = Suppliers
.Where(String.Format("{0} == '"abc'"", columnName))
.Select(new {c.id, c.supplier};
下面是动态 Linq 的完整工作示例,其中列名是一个参数:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic;
public class Program
{
public static void Main()
{
var lstContacts = new List<Contact>{
new Contact{Id = 1, Active = true, Name = "Chris"},
new Contact{Id = 2, Active = true, Name = "Scott"},
new Contact{Id = 3, Active = true, Name = "Mark"},
new Contact{Id = 4, Active = false, Name = "Alan"}};
string columnName = "Active";
List<Contact> results = lstContacts.Where(String.Format("{0} == true", columnName)).ToList();
foreach (var item in results)
{
Console.WriteLine(item.Id.ToString() + " - " + item.Name.ToString());
}
}
}
public class Contact
{
public int Id
{
get;
set;
}
public bool Active
{
get;
set;
}
public string Name
{
get;
set;
}
}
你可以在这里尝试这个.net-fiddle-
我正在复活这个旧线程,因为我今天不得不在 Core 2.2 ASP.NET 解决这个问题。我使用 System.Linq.Dynamic.Core NuGet 包创建了以下扩展方法,如果您需要检查多个给定字符串值是否包含在多个给定列中,该方法效果很好。
public static IQueryable<TEntity> WhereContains<TEntity>(
this IQueryable<TEntity> query,
string field,
string value,
bool throwExceptionIfNoProperty = false,
bool throwExceptionIfNoType = false)
where TEntity : class
{
PropertyInfo propertyInfo = typeof(TEntity).GetProperty(field);
if (propertyInfo != null)
{
var typeCode = Type.GetTypeCode(propertyInfo.PropertyType);
switch (typeCode)
{
case TypeCode.String:
return query.Where(String.Format("{0}.Contains(@0)", field), value);
case TypeCode.Boolean:
var boolValue = (value != null
&& (value == "1" || value.ToLower() == "true"))
? true
: false;
return query.Where(String.Format("{0} == @0", field), boolValue);
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
return query.Where(String.Format("{0}.ToString().Contains(@0)", field), value);
// todo: DateTime, float, double, decimals, and other types.
default:
if (throwExceptionIfNoType)
throw new NotSupportedException(String.Format("Type '{0}' not supported.", typeCode));
break;
}
}
else
{
if (throwExceptionIfNoProperty)
throw new NotSupportedException(String.Format("Property '{0}' not found.", propertyInfo.Name));
}
return query;
}
该代码可与 一起使用。网络斯坦达/.NETCore(使用前面提到的System.Linq.Dynamic.Core包)以及 ASP.NET 4.x(使用System.Linq.Dynamic包)。
有关 WhereContains 扩展方法和完整用例信息的更多信息,请查看我博客上的这篇文章。
只需使用
typeof 来使用列名
public string columnName(string Id, string columnName, string columndata)
{
var story = _CidbContext.Stories.Where(m => m.Id.ToString() == Id).FirstOrDefault();
var property = typeof(Story).GetProperty(columnName);
if (property != null)
{
var convertedValue = Convert.ChangeType(columndata, property.PropertyType);
property.SetValue(story, convertedValue);
_CidbContext.SaveChanges();
return "Data Saved";
}
return "No Column found";
}