标签: dynamic-linq

通过动态LINQ可以注入吗?

使用Dynamic LINQ库(链接),是否容易受到注入?和(如果是的话)如何防止这种情况?

安全注意事项(实体框架)的一些背景知识:

LINQ to Entities注入攻击:

尽管在LINQ to Entities中可以进行查询组合,但它是通过对象模型API执行的.与实体SQL查询不同,LINQ to Entities查询不是使用字符串操作或连接组成的,并且它们不易受传统SQL注入攻击的影响.

由于动态SQL是使用字符串组成的,这意味着它可能容易受到注入向量的影响吗?或者LINQ to SQL会根据Dynamic LINQ库中的基础数据类型自动处理参数化值吗?

或者它是完全安全的,因为动态查询将在内存中执行而不是在SQL上执行(从而否定SQL索引的任何好处)?

我一直在努力理解DynamicLibrary.cs代码,但我确信我可以很容易地忽略一些东西.

由于这个问题是关于动态LINQ库本身,这个问题可以被认为适用于两者linq-to-sqllinq-to-entities(尽管上面引用了实体框架).

c# linq linq-to-entities dynamic-linq linq-to-sql

41
推荐指数
1
解决办法
1万
查看次数

将Expression <T,bool>转换为String

我需要一种方法来在将来的某个时刻重新创建动态生成的报告.简而言之,我需要将特定的linq查询(每个报告不同)存储到数据库中,然后使用动态Linq执行查询.

这一切都很好,但我找不到将表达式转换为字符串的方法.

如:

Expression<Func<Product, bool>> exp = (x) => (x.Id > 5 && x.Warranty != false);
Run Code Online (Sandbox Code Playgroud)

应成为:

"Product.Id > 5 && Product.Warranty != false"
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

c# expression dynamic-linq

35
推荐指数
1
解决办法
1万
查看次数

动态LINQ - 是否有.NET 4版本?

我正在寻找一些搜索例程使用LINQ,并希望有一些动态where子句.因此,例如,如果用户想要按城市搜索或按州搜索,我会有一个动态LINQ Where <>调用而不是创建两个强类型LINQ表达式,然后根据用户想要搜索的方式使用适当的LINQ表达式.

所以我想这样做:

String criteria="p.City='Pittsburgh'";  //or "p.State='PA'"
personData.Where(criteria)
Run Code Online (Sandbox Code Playgroud)

代替

personData.Where(p => p.City=="Pittsburgh");

要么

personData.Where(p => p.State=="PA");

我看到Scott Guthrie在Visual Studio 2008样本中谈论Dynamic LINQ 的博客文章.这似乎做我想要的,但我的问题是:

  1. 此示例库是否受Microsoft支持?
  2. Scott Guthrie的文章是关于VS2008(.NET 3.5)的..NET 4有更好的选择吗?也许用.NET 4发布的东西可以实现同样的东西(或者非常接近的东西)?

提前致谢!

c# linq dynamic-linq linq-expressions

31
推荐指数
3
解决办法
2万
查看次数

如何使用Dynamic Linq进行左外连接?

我试图在这里模仿左外连接,但使用动态linq扩展方法.是)我有的:

public static IQueryable SelectMany(this IQueryable source, string selector, 
    string resultsSelector, params object[] values)
{
    if (source == null) throw new ArgumentNullException("source");
    if (selector == null) throw new ArgumentNullException("selector");

    // Parse the lambda 
    LambdaExpression lambda = DynamicExpression.ParseLambda(
        source.ElementType, null, selector, values);

    // Fix lambda by recreating to be of correct Func<> type in case  
    // the expression parsed to something other than IEnumerable<T>. 
    // For instance, a expression evaluating to List<T> would result  
    // in a …
Run Code Online (Sandbox Code Playgroud)

.net c# linq dynamic-linq linq-to-sql

23
推荐指数
1
解决办法
4672
查看次数

System.LINQ.Dynamic:选择("new(...)")到List <T>(或任何其他可枚举的<T>集合)

假设我有一个包含四列的DataTable,Company(字符串),Fund(字符串),State(字符串),Value(double):

    table1.Rows.Add("Company 1","Fund 1","NY",100));
    table1.Rows.Add("Company 2","Fund 1","CA",200));
    table1.Rows.Add("Company 3","Fund 1","FL",300));
    table1.Rows.Add("Company 4","Fund 2","CA",400));
    table1.Rows.Add("Company 5","Fund 1","NY",500));
    table1.Rows.Add("Company 6","Fund 2","CA",600));
    table1.Rows.Add("Company 7","Fund 3","FL",700));
Run Code Online (Sandbox Code Playgroud)

我想使用System.LINQ.Dynamic构建一个动态查询,该查询在公司,基金或州上分组,然后按条件选择我的组作为第一列,并且sum(value):

string groupbyvalue="Fund";
var q1= table1.AsEnumerable().AsQueryable()
              .GroupBy(groupbyvalue,"it")
              .Select("new ("+groupbyvalue+" as Group, Sum(Value) as TotalValue)");
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,所选的groupbyvalue(Group)将始终是一个字符串,并且总和将始终为double,因此我希望能够转换为类似List的内容,其中Result是具有属性Group的对象(字符串) )和TotalValue(双).

我遇到很多麻烦,有人可以解决这个问题吗?

linq dynamic-linq

20
推荐指数
1
解决办法
4万
查看次数

是否可以使用GPU加速(动态)LINQ查询?

我一直在寻找有关使用GPU加速LINQ查询的可能性的可靠信息.

到目前为止我已经"调查过"的技术:

  • Microsoft Accelerator
  • Cudafy

简而言之,甚至可以对GPU上的对象进行内存中过滤吗?

假设我们有一些对象的列表,我们想要过滤类似的东西:

var result = myList.Where(x => x.SomeProperty == SomeValue);
Run Code Online (Sandbox Code Playgroud)

关于这个的任何指针?

提前致谢!

UPDATE

我会尝试更具体地说明我想要实现的目标:)

目标是使用任何技术,能够以绝对最快的方式过滤对象列表(范围从~50 000到〜2 000 000).

在完成过滤(sum,min,max等)时对数据执行的操作是使用内置的LINQ方法完成的,并且对于我们的应用程序已经足够快,所以这不是问题.

瓶颈是"简单地"过滤数据.

UPDATE

只是想补充一点,我已经测试了大约15个数据库,包括MySQL(检查可能的集群方法/ memcached解决方案),H2,HSQLDB,VelocityDB(目前正在进一步调查),SQLite,MongoDB等,而NONE就足够了过滤数据的速度(当然,NO-sql解决方案不提供像sql那样,但你得到了想法)和/或返回实际数据.

只是总结一下我/我们需要的东西:

一种数据库,能够在不到100毫秒的时间内对200列和大约250 000行的数据进行排序.

我目前有parallellized LINQ的解决方案,它能够(在特定的机器上)只花纳米过滤时每行-seconds 处理的结果!

所以,我们需要像子纳米每行5秒-过滤.

  1. 为什么只有内存LINQ能够提供这个?
  2. 为什么这不可能?

日志文件中的一些数字:

Total tid för 1164 frågor: 2579
Run Code Online (Sandbox Code Playgroud)

这是瑞典语并翻译:

Total time for 1164 queries: 2579
Run Code Online (Sandbox Code Playgroud)

在这种情况下,查询是这样的查询:

WHERE SomeProperty = SomeValue
Run Code Online (Sandbox Code Playgroud)

这些查询都是在225639行上并行完成的.

因此,225639行在大约2.5秒内在存储器中被过滤1164次.

这是9,5185952917007032597107300413827e-9秒/行,但是,还包括数字的实际处理!我们做Count(非null),总计数,Sum,Min,Max,Avg,Median.因此,我们对这些过滤行进行了7次操作.

所以,我们可以说it's实际上快7倍比数据库we've尝试,因为我们不要做任何聚集的东西,在这种情况下!

总而言之,与内存LINQ过滤相比,为什么数据库在过滤数据方面如此差劲?微软真的做得这么好,以至于无法与它竞争吗?:)

虽然内存中过滤应该更快,但我不想要感觉它更快.我想知道什么是更快,如果可能的 …

c# linq gpu dynamic-linq

14
推荐指数
1
解决办法
1982
查看次数

动态库(System.Linq.Dynamic)如何支持LIKE运算符?

任何机构都可以告诉我如何使用microsoft Dynamic Expression API管理LIKE运算符?

我需要在动态查询中添加多个Like Expression

/*
var query =
db.Customers.
Where("CityName Like @0 or CityName Like @1", "London", "USA")
*/
var query =
db.Customers.
Where("CityName Like @0 or CityName Like @1%", "London", "USA")
Run Code Online (Sandbox Code Playgroud)

谢谢堆

c# linq asp.net dynamic-linq

13
推荐指数
3
解决办法
1万
查看次数

使用OrElse和AndAlso表达式方法的异常

我试图以编程方式构建表达式树.

我在输入中有一个条件类列表,它们具有以下形式:

public class Filter
{
    public string field { get; set; }
    public string operator { get; set; }
    public string value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我构建Expression对象时,我Expression按以下方式为每个条件创建一个

foreach ( Filter sf in rules ) {
    Expression ex = sf.ToExpression( query );
    if ( mainExpression == null ) {
        mainExpression = ex;
    }
    else {
        if ( logicalCondition == "AND" ) {
            mainExpression = Expression.And( mainExpression, ex );
        }
        else if ( logicalCondition == "OR" …
Run Code Online (Sandbox Code Playgroud)

linq linq-to-entities entity-framework dynamic-linq

12
推荐指数
1
解决办法
9610
查看次数

如何使用Dynamic LINQ使用GroupBy

我正在尝试使用动态LINQ进行GroupBy,但无法使其工作.

这是一些说明问题的示例代码:

List<dtoMyAlbum> listAlbums = new List<dtoMyAlbum>();
for (int i = 0; i < 5000; i++)
{
    dtoMyAlbum album = new dtoMyAlbum
    {
        Author = "My Author",
        BookID = i,
        CurrSymbol = "USD",
        Price = 23.23,
        Shop = i % 3 == 0 ? "TESCO" : "HMV"
    };
    listAlbums.Add(album);
}

IQueryable<dtoMyAlbum> mydata = listAlbums.AsQueryable();
int count = mydata.Count();

//var mydataGrouped = mydata.GroupBy(a => a.Shop);      // <-- this works well (but is not dynamic....)
var mydataGrouped = mydata.GroupBy("Shop");             // <-- does …
Run Code Online (Sandbox Code Playgroud)

c# linq dynamic-linq

11
推荐指数
1
解决办法
1万
查看次数

动态LINQ直接用户输入,有任何危险吗?

我在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.

只是确定,谢谢:)

c# linq sql-injection dynamic-linq

10
推荐指数
3
解决办法
2048
查看次数