我在ASP.NET MVC应用程序中有一个表,我希望它是可排序的(服务器端)并且可以使用AJAX过滤.我希望它在其他地方使用起来相当容易,并且不想将排序和过滤硬编码到查询表达式中,所以我找到了一种动态构建表达式的方法,我找到的最好的方法是使用Dynamic LINQ .
来自以下URL的用户输入直接插入到动态Where或OrderBy中.
/Orders?sortby=OrderID&order=desc&CustomerName=Microsoft
Run Code Online (Sandbox Code Playgroud)
这将导致两个表达式:
OrderBy("OrderID descending")
Where(@"CustomerName.Contains(""Microsoft"")")
Run Code Online (Sandbox Code Playgroud)
虽然我明白它不会直接在数据库中抛出,并且在这里插入直接的SQL将无法工作,因为它无法反映到属性中,并且它是类型安全的所有,我想知道是否有人比我更有创意无论如何都可以找到一种方法来利用它.我能想到的一个漏洞是可以对表中不可见的属性进行排序/过滤,但这并不是有害的,因为它们仍然无法显示,并且可以通过散列来防止它.
我允许直接用户输入的唯一方法是使用OrderBy和Where.
只是确定,谢谢:)
我需要将以下LINQ查询转换为动态LINQ,它根据用户输入接受多个分组列.基本上我有一堆应用分组的下拉列表,我不想枚举每个分组组合.如果动态LINQ失败,我可能必须手动构建SQL查询,没有人想要它.
var grouping = ( from entry in ObjectContext.OmniturePageModules
where entry.StartOfWeek >= startDate && entry.StartOfWeek <= endDate &&
( section == "Total" || section == "All" || entry.Section == section ) &&
( page == "Total" || page == "All" || entry.Page == page ) &&
( module == "Total" || module == "All" || entry.Module == module )
group entry by new
{
entry.Page, // I want to be able to tell this anonymous type
entry.Module, // which columns …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
var vectorTest = new Vector2(1, 2) + new Vector2(3, 4); // Works
var x = Expression.Parameter(typeof(Vector2), "x");
var test = System.Linq.Dynamic
.DynamicExpression.ParseLambda(new[] { x }, null, "x = x + x");
Run Code Online (Sandbox Code Playgroud)
运行它,我得到以下例外:
System.Linq.Dynamic.ParseException未由用户代码处理Message = Operator'+'与操作数类型'Vector2'和'Vector2'不兼容Source = DynamicLINQ Position = 6
如何让解析器"看到" 类型的+运算符重载Vector2?
编辑:我也与=运营商有同样的问题.
查看源代码我可以看到原因,它查看了一个特殊的接口,列出了大量的方法,对于简单的类型,如果它找不到它,那么就会引发异常.麻烦的是,我的type(Vector2)不在该列表中,所以它永远不会找到运算符方法.
因此,我想对我的数据进行常规分类。我有这段代码从数据库中获取数据,该数据库将仅提取包含的数据value。
using System.Linq.Dynamic;
public static IQueryable<object> SortList(string searchString, Type modelType,
IQueryable<object> model)
{
....
string toStringPredicate = type == typeof(string) ? propertyName +
".Contains(@0)" : propertyName + ".ToString().Contains(@0)";
model = model.Where(propertyName + " != NULL AND " + toStringPredicate, value);
}
Run Code Online (Sandbox Code Playgroud)
该模型是这样的:
public class ManageSubscriberItems
{
public int? UserId { get; set; }
public string Email { get; set; }
public Guid SubscriberId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时:
models = (IQueryable<ManageSubscriberItems>)EcommerceCMS.Helpers.FilterHelper
.SortList(searchString, typeof(ManageSubscriberItems), models);
if(models.Any())
Run Code Online (Sandbox Code Playgroud)
它引发此错误:
“ …
免责声明:我使用System.Linq.Expressions中的表达式解决了这个问题,但我仍然在寻找更好/更简单的方法.
考虑以下情况:
var query =
from c in db.Customers
where (c.ContactFirstName.Contains("BlackListed") ||
c.ContactLastName.Contains("BlackListed") ||
c.Address.Contains("BlackListed"))
select c;
Run Code Online (Sandbox Code Playgroud)
需要根据列入黑名单的术语检查的列/属性仅在运行时可用.如何生成这个动态where子句?
另一个复杂因素是Queryable集合(上面的db.Customers)被输入到'Customer'基类的Queryable中(比如'Person'),因此不能选择编写c.Address.
我在Silverlight中有一个组合框.它有一个由我的一个LINQ-to-SQL对象(即Name,Address,Age等)的属性构建的值集合.我想根据组合框中选择的值过滤我的结果.
示例:假设我希望每个人姓氏为"Smith".我从下拉列表中选择"姓氏",然后在文本框控件中输入smith.通常我会写一个类似于......的LINQ查询
var query = from p in collection
其中p.LastName == textbox.Text
select p;
是否可以动态决定属性,也许使用Reflection?就像是
var query = from p in collection
where p.(DropDownValue)== textbox.Text
select p;
我想在动态LINQ查询中使用枚举.
是否可能,如果,如何?
考虑下面的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Room aRoom = new Room() { Name = "a Room" };
Room bRoom = new Room() { Name = "b Room" };
Room cRoom = new Room() { Name = "c Room" };
House myHouse = new House
{
Rooms = new List<Room>(new Room[] { aRoom }),
MainRoom = aRoom
};
House yourHouse = new House()
{
Rooms …Run Code Online (Sandbox Code Playgroud) 维基百科指出,规范模式是通过使用布尔逻辑将业务逻辑链接在一起来重新组合业务逻辑的地方.关于从列表或集合中选择过滤对象,在我看来,Dynamic LINQ允许我完成同样的事情.我错过了什么吗?是否还应考虑规格模式的其他好处?
编辑:
我发现了一些讨论组合LINQ和规范模式的帖子:
通过Nicqas Blumhardt(Autofac dude)通过Linq实施规范模式
有没有人走过这条路并且维护起来变得复杂了?
我试图使用动态linq查询从对象集合(Linq到Object)中检索IEnumerable <T>,集合中的每个对象都有一个内部集合,其中包含存储数据的另一组对象,这些值通过外部集合中的索引器访问
当您使用强类型对象但我的对象将数据存储在动态类型的成员中时,动态linq查询会按预期返回已过滤的集,请参阅下面的示例:
public class Data
{
public Data(string name, dynamic value)
{
this.Name = name;
this.Value = value;
}
public string Name { get; set; }
public dynamic Value { get; set; }
}
public class DataItem : IEnumerable
{
private List<Data> _collection;
public DataItem()
{ _collection = new List<Data>(); }
public dynamic this[string name]
{
get
{
Data d;
if ((d = _collection.FirstOrDefault(i => i.Name == name)) == null)
return (null);
return (d.Value);
}
}
public …Run Code Online (Sandbox Code Playgroud) 可能吗?
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;
}
Run Code Online (Sandbox Code Playgroud)
要么
var x=(from o in db.table_Name where o.Id=PK_val select o.Field_Name).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
在这里,我正在传递Table_Name,Column_Name并且条件值(PK_val)Column_Name从Table_Name某个条件(Id=Pk_val)中获取.
可能吗??
dynamic-linq ×10
linq ×8
c# ×7
.net ×3
lambda ×2
linq-to-sql ×2
dynamic ×1
silverlight ×1
sql-server ×1