我在ASP.NET MVC中创建了一个动态搜索屏幕.我通过反射从实体中检索了字段名称,这样我就可以允许用户选择要搜索的字段而不是显示视图中的所有字段.
当搜索结果回发到控制器时,我收到一个包含FieldName和Value的FormCollection.我不知道搜索了多少字段,FormCollection只包含用户选择的字段.
我希望现在能够获取该字段名称并在我查询数据库时将其应用于我的LINQ语句,例如:
public List<People> SearchPeople(Dictionary<string, string> fieldValueDictionary)
{
List<People> searchResults = new List<People>();
foreach (string key in fieldValueDictionary.Keys)
{
searchResults.Add(entities.People.Where(p => p.<use the key string as the fieldName> == fieldValueDictionary[key]));
}
return searchResults;
}
Run Code Online (Sandbox Code Playgroud)
我在"使用键字符串作为fieldName"的地方就像p => p.FirstName == fieldValueDictionary [key]其中key ="FirstName".我尝试过并且未能使用Lambda Expression Trees,并且在动态LINQ方面取得了一些成功.唯一的另一种选择是做类似的事情:
public List<People> SearchPeople(Dictionary<string, string> fieldValueDictionary)
{
IQueryable<People> results = entities.People;
foreach (string key in fieldValueDictionary.Keys)
{
switch (k)
{
case "FirstName": results = results.Where(entities.People.Where(p => p.FirstName == k);
case "LastName": results = results.Where(entities.People.Where(p => p.LastName …Run Code Online (Sandbox Code Playgroud) 我有一个问题,无论我怎么努力,我都无法解决这个问题.
该公司在市场分析中工作,并且有相当大的表(300K - 1M行)和MANY列(想想250-300)我们做了一些计算.
我会试着直接解决这个问题:
问题是过滤数据.到目前为止,我尝试过的所有数据库都太慢,无法选择数据并将其返回.
目前我将整个表存储在内存中并使用动态LINQ进行过滤.
然而,虽然这很快(过滤250 000行约100毫秒)我需要比这更好的结果......
有什么方法可以改变我的代码(不是数据模型)中的某些东西,这可以加快过滤速度吗?
我尝试过使用:
DataTable.Select哪个很慢.动态LINQ哪个更好,但仍然太慢.正常LINQ(仅用于测试目的)几乎足够好.从MySQL获取并稍后进行处理,这很糟糕.
在这个项目的开始,我们认为一些高性能的数据库能够处理这个,但我试过:
H2(IKVM)HSQLDB(编译的ODBC驱动程序)CubeSQL MySQL SQL SQLite ...
而且它们与.NET接口并从中获取结果都非常慢.
我还尝试将数据拆分成块,然后在运行时将它们组合起来,以使需要过滤的数据总量更小.
在这个宇宙中有什么办法可以让它更快吗?
提前致谢!
UPDATE
我只是想补充一点,我还没有创建这个有问题的数据库.
要添加一些数字,如果我在数据库查询窗口(SQLyog)中这样简单地选择2个字段(visit_munic_name被索引):
SELECT key1, key2 FROM table1 WHERE filter1 = filterValue1
Run Code Online (Sandbox Code Playgroud)
225639行需要125毫秒.
为什么这么慢?我测试了2个不同的盒子.
当然他们必须改变一些,显然呢?
我正在用C#开发一个ASP.NET MVC3应用程序.
我试图在我的应用程序中实现一个"缩小"功能应用从搜索获得的结果集.
简而言之,在我执行搜索并将结果显示在页面的中心之后,我希望在页面的左/右侧CheckBoxList为搜索结果的每个属性提供帮助.的CheckBox每一个CheckBoxList代表不同的值的属性.
例如,如果我搜索Product它并且它具有Color值为蓝色,红色和黄色的属性,我创建一个CheckBoxList带有文本颜色和CheckBox每个颜色三个一个.
在对Web进行研究后,我发现Scott Guthrie提供了这个动态LINQ库.由于我发现最近的一个示例/教程是从2009年开始,我想知道这个库是否真的很好(和维护).
在后一种情况下,jQuery是实现此类功能的最佳方式吗?
我做了这个查询以从表中获取数据
List<MyTable> liDeatil = Db.Database.SqlQuery<MyTable>("SELECT * FROM [myDB].[dbo].[MyTable]").ToList();
Run Code Online (Sandbox Code Playgroud)
从liDetail我想要动态选择列,如
liDeatil.Select(s => new myclass{ Id = s.Id ,Marks = ....}).Tolist();
Run Code Online (Sandbox Code Playgroud)
MyClass的地方
public class MyClass
{
public Nullable<decimal> Id { get; set; }
public string Marks { get; set; }
public string rank { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
是否有任何方法来获取专栏帮助我
我尝试通过反思来做到这一点但它不起作用
var ss = liDeatil.Select(s => new MyClass{ Id = s.Id ,Marks = s.GetType().GetProperties("ColumnMarks")}).Tolist();
Run Code Online (Sandbox Code Playgroud)
EDITED
public class MyTable
{
public Nullable<decimal> Id { get; set; }
public string ColumnMarks{ get; set; …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的查询,看起来像这样
select *
from job
where jobId like '%23%'
or title like '%23%'
Run Code Online (Sandbox Code Playgroud)
我需要能够使用动态Linq复制它
我最接近的是这个,但它不起作用
.Where("@0.Contains(jobId) or title.Contains(@0)", "23");
Run Code Online (Sandbox Code Playgroud)
有没有人有这个解决方案,理想情况下我希望它在int和字符串上做类似的
基于评论的附录
错误是:
System.Linq.Dynamic.dll中出现"System.Linq.Dynamic.ParseException"类型的异常但未在用户代码中处理附加信息:"String"类型中不存在适用的方法"Contains"
该jobId领域是一个int,而title一个是varchar.
我已经安装了System.Linq.Dynamicdll然后尝试在Linq中添加字符串作为WHERE子句的参数.但我仍然得到WHERE子句支持字符串参数的错误.
码:
_dbContext.TmRecords.Where("city=london");
Run Code Online (Sandbox Code Playgroud)
错误:
严重级代码描述项目文件行错误CS1503参数2:无法从'string'转换为'System.Linq.Expressions.Expression>'Extranet.Domain
这里city参数动态地改变为其他参数.所以,我需要在linq中使用动态查询.
我目前正在尝试编写Dynamic Linq的扩展.为此,我需要为IEnumerableSignatures位于内部类中的接口添加方法签名ExpressionParser.
internal class ExpressionParser
{
interface IEnumerableSignatures
{
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
虽然我可以直接将签名添加到代码中,但我宁愿将其定义为接口的扩展方法,以保持原始代码的清洁.通常,要添加方法DefaultIfEmpty,我会这样做:
internal static class Extension
{
static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig);
}
Run Code Online (Sandbox Code Playgroud)
这会产生访问错误,因为它ExpressionParser是内部的.我已经尝试过几种类和方法的访问级别组合.
有没有办法为这样的接口添加扩展方法或者我是否需要弄乱原始代码?
[编辑]事实证明,即使将界面本身设置为内部(或公共内容),动态linq也无法识别它.我在运行时仍然遇到了一些未发现的异常.因此编辑codeplex代码没有(明显的)方法.[/编辑]
我在使用Dynamic Linq时遇到了一些麻烦,我希望有人可以提供帮助.我面临的问题是我需要按特定顺序排序列表.在SQL中我会写这个:
ORDER BY CASE WHEN Blah = 'blah' THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)
我将如何使用Dynamic Linq实现这一目标?
我尝试过类似的东西:
listToSort.AsQueryable().OrderBy("CASE WHEN Blah = 'blah' THEN 1 ELSE 0 END")
Run Code Online (Sandbox Code Playgroud)
但这会返回错误
类型中不存在属性或字段"CASE"
此代码在运行时作为表达式列表生成.所以我使用Dynamic Linq将这些经历用作字符串.
我正在尝试调用Regex.IsMatch()并在动态linq查询中评估返回的结果.这是我试过的:
public static LambdaExpression Parse(SearchQuery query)
{
string compilableExpression = "Regex.IsMatch(Category.ToLower(), \"\\bSomeCat\\b\", RegexOptions.Compiled) == true";
ParameterExpression parameter1 = System.Linq.Expressions.Expression.Parameter(typeof(EventListItem));
ParameterExpression parameter2 = System.Linq.Expressions.Expression.Parameter(typeof(Regex));
return System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { parameter1, parameter2 }, null, compilableExpression);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下Category是一个属性EventListItem.调用时抛出此异常ParseLambda():
Unknown identifier 'Regex'.
有没有办法调用方法?我遇到了Expression.Call()方法,但我不确定这是否是我正在寻找的.任何帮助表示赞赏.
dynamic-linq ×9
c# ×8
linq ×4
.net ×2
database ×1
filtering ×1
lambda ×1
performance ×1
regex ×1