在这里,我们将给大家分享关于如何在LINQtoEntityFramework中使用SQL通配符的知识,同时也会涉及到如何更有效地.net–Linq到Sql和EntityFramework的未来、.ne
在这里,我们将给大家分享关于如何在LINQ to Entity Framework中使用SQL通配符的知识,同时也会涉及到如何更有效地.net – Linq到Sql和Entity Framework的未来、.net – 为什么要在Linq2SQL上使用Entity Framework、c# – LINQ或Entity Framework创建无界的SQL语句、c# – 在Entity Framework中使用简单查询,性能非常差的内容。
本文目录一览:- 如何在LINQ to Entity Framework中使用SQL通配符
- .net – Linq到Sql和Entity Framework的未来
- .net – 为什么要在Linq2SQL上使用Entity Framework
- c# – LINQ或Entity Framework创建无界的SQL语句
- c# – 在Entity Framework中使用简单查询,性能非常差
如何在LINQ to Entity Framework中使用SQL通配符
我有一个查询,看起来像这样:
IQueryable<Profile> profiles = from p in connection.Profiles where profile.Email.Contains(txtSearch) select p;
我知道,将其转换为SQL时会使用a,LIKE ''%<value of txtSearch>%''
但如果txtSearch ="jon%gmail.com"
将其转换为`LIKE''%jon〜%gmail.com%’。〜转义中间的通配符%。我该如何解决?我需要能够将通配符放入LINQ
to EF搜索中。
答案1
小编典典我不知道这是可能直接与LINQ,因为你可以调用像只有基本的字符串函数Contains
,StartsWith
或EndsWith
。使用EntitySQL是可能的,因此您可以组合使用这些方法。
var query = new ObjectQuery<Profile>( @"SELECT VALUE p FROM CsdlContainerName.Profiles AS p WHERE p.Email LIKE ''" + wildcardSearch + "''", context);var result = query.AsQueryable().OrderByDescending(p => p.Name).ToList();
ESQL注入反击:)
没有注入漏洞的第二个版本(我没有尝试过,但是应该可以使用):
var commandText = @"SELECT VALUE p FROM CsdlContainerName.Profiles AS p WHERE p.Email LIKE @search";var query = new ObjectQuery<Profile>(commandText, context);query.Parameters.Add(new ObjectParameter("search", wildcardSearch));var result = query.AsQueryable().OrderByDescending(p => p.Name).ToList();
.net – Linq到Sql和Entity Framework的未来
解决方法
.net – 为什么要在Linq2SQL上使用Entity Framework
我正在为一个非营利组织构建内部应用程序.我是工作人员的唯一开发人员.我们一直使用sql Server作为我们的数据库后端.我也设计和构建数据库.我已经使用L2S成功了几次.
考虑到这一点,有人能给我一个引人注目的理由来使用EF而不是L2S吗?
我在本周末在代码营,经过一个小时的EF演示,所有这些都可以在L2S中完成,我问了同样的问题.演讲者的答案是,“L2S死了…”很好!不! (see here)
我明白EF是我们以后要使用的MS(see here),它提供了更多的定制选项.我无法想像的是,如果在这种环境中,任何一个或那个对我来说都是重要的.
我们在这里遇到的一个特别的问题是我继承了基于4个不同sql数据库的Core App. L2S有很大困难,但是当我问上述演讲者时,EF会帮助我在这方面他说“不!”
解决方法
c# – LINQ或Entity Framework创建无界的SQL语句
这是一些代码:
SomeList.AddRange(_databaseView .Select(l=> new Someviewmodel { Date = l.Date,Details = l.Details,Level = l.LevelName,Id = l.ViewID,Message = l.Message,ProjectName = l.projectName,StatusId = l.StatusID,StatusName = l.StatusName }) .Skip(50) .Take(25));
从理论上讲,它应该创建一个sql语句,它需要25条记录但是分析器会在sql之后显示它:
SELECT [Extent1].[Date] AS [Date],[Extent1].[ID] AS [ID],[Extent1].[LevelID] AS [LevelID],[Extent1].[StatusID] AS [StatusID],[Extent1].[projectName] AS [projectName],[Extent1].[LevelName] AS [LevelName],[Extent1].[StatusName] AS [StatusName],[Extent1].[Message] AS [Message],[Extent1].[Details] AS [Details],[Extent1].[LogViewID] AS [LogViewID] FROM (SELECT [v_MyView].[Date] AS [Date],[v_MyView].[ProjectID] AS [ProjectID],[v_MyView].[LevelID] AS [LevelID],[v_MyView].[StatusID] AS [StatusID],[v_MyView].[projectName] AS [projectName],[v_MyView].[LevelName] AS [LevelName],[v_MyView].[StatusName] AS [StatusName],[v_MyView].[Message] AS [Message],[v_MyView].[Details] AS [Details],[v_MyView].[ViewID] AS [ID] FROM [dbo].[v_MyView] AS [v_MyView]) AS [Extent1]
_databaseView是IQueryable对象,我的所有排序和过滤逻辑都在其上完成.
这是我想到的:
如果我不做任何过滤sql是正常的SELECT TOP(25)就可以了.但每当我做过滤时,一些东西都搞砸了.这是我的一个过滤器的代码:
if (Filters.ProjectName != null && Filters.ProjectName[0] != 0) // check if "all" is not checked _databaseView = Filters.ProjectName .Join(_databaseView,f => f,l => l.ProjectID,(f,l) => new Someviewmodel { Date = l.Date,LevelName = l.LevelName,ViewID = l.ViewID,projectName = l.projectName,StatusID = l.StatusID,StatusName = l.StatusName }) .AsQueryable();
它没有任何限制.如何使这个LINQ-EF产生一些好的sql呢?
Thx提前!
解决方法
例如,这个:
var foo = MyObjectContext.someEntitySet.AsEnumerable().AsQueryable().Take(10);
…不会把TOP放在sql中.
但是这个:
var bar = MyObjectContext.someEntitySet.Take(10);
……会的.
再一次:你还没有说_DatabaseView是什么.直接在ObjectContext上尝试此操作,您将看到它的工作原理.该错误位于用于分配_DatabaseView的代码中,您尚未向我们展示.
c# – 在Entity Framework中使用简单查询,性能非常差
>我的订单具有唯一的OrderNumber
>订单有很多OrderRows
> OrderRows有许多RowExtras,它们有2个字段,position(OrderRow中RowExtra的序列号)和Info,它是一个字符串. OrderRow通常没有多个RowExtra.
(现在不要介意愚蠢的结构,它就是这样的).
所以现在我得到一个具有三个属性的对象列表:
> OrderNumber
>立场
>信息
我想要做的只是1)检查数据库中是否存在具有给定OrderNumber / Position -pair的RowExtra,如果存在,则2)更新Info-property.
我尝试了几种不同的方法来实现这一点,结果非常糟糕.解决方案循环遍历对象列表并发出诸如的查询
myContext.RowExtras.Where(x => x.Position == currentPosition && x.OrderRow.Order.OrderNumber == currentOrderNumber)
或从另一边走
myContext.Orders.Where(x => x.OrderNumber == currentOrderNumber) .SelectMany(x => x.OrderRows) .SelectMany(x => x.RowExtras) .Where(x => x.Position == currentPosition)
然后检查计数是否等于1,如果是,则更新属性,否则继续下一个项目.
我目前在数据库中有大约4000个RowExtras,需要更新其中一半.这些方法使程序需要几分钟才能完成,这是不可接受的.我不明白为什么需要这么长时间,因为返回所需RowExtra的sql子句很容易手动编写(在where-part中只有2个连接和2个条件).
我设法实现的最佳性能是使用看起来像这样的编译查询
Func<MyContext,int,string,IQueryable<RowExtra>> query = CompiledQuery.Compile( (MyContext ctx,int position,string orderNumber) => from extra in ctx.RowExtras where extra.Position == position && extra.OrderRow.Order == orderNumber select extra);
然后为列表中的每个对象调用所述查询.但即便采用这种方法也需要一分钟.那么我如何在合理的时间范围内实现这一目标呢?
此外,我很抱歉这个过长的解释,但希望有人可以帮助我!
解决方法
因此,通常,一次性获取您需要的所有数据,在代码中修改它然后保存它.
List<Order> orders = myContext.Orders .Include( "OrderRows.RowExtras" ) .Where( ... select all the orders you want,not just one at a time ... ) .ToList(); foreach ( Order order in orders ) { ... execute your logic on the in-memory model } myContext.SaveChanges();
今天关于如何在LINQ to Entity Framework中使用SQL通配符的介绍到此结束,谢谢您的阅读,有关.net – Linq到Sql和Entity Framework的未来、.net – 为什么要在Linq2SQL上使用Entity Framework、c# – LINQ或Entity Framework创建无界的SQL语句、c# – 在Entity Framework中使用简单查询,性能非常差等更多相关知识的信息可以在本站进行查询。
本文标签: