GVKun编程网logo

如何在LINQ to Entity Framework中使用SQL通配符

28

在这里,我们将给大家分享关于如何在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通配符

如何在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,因为你可以调用像只有基本的字符串函数ContainsStartsWithEndsWith。使用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 – Linq到Sql和Entity Framework的未来

我在一个项目上工作,想要使用ORM.我应该使用什么: Linq to sql或Entity Framework?正如我所看到的,Linq to sql提供了更多机会,例如对枚举类型的支持.然而,也有人说,Linq to sql是为了Linq的游戏和学习而微软的未来战略在于实体框架.那么我应该使用哪一个?

解决方法

据我所知,对LINQ to sql的支持不会随处可见,但正在进行开发的大部分资源都将用于LINQ to Entities.我认为无论哪个方向看起来都是更好的选择,你都是安全的.如果它是LINQ to sql,那么只要它拥有你需要的一切就可以了 – 不要指望新功能.

.net – 为什么要在Linq2SQL上使用Entity Framework

.net – 为什么要在Linq2SQL上使用Entity Framework

要清楚,我不是要求一个并排的比较,已经在这个SO上面提到了“恶心”.我也不问 Linq2sql是否死了,因为我不在乎.我问的是这个….

我正在为一个非营利组织构建内部应用程序.我是工作人员的唯一开发人员.我们一直使用sql Server作为我们的数据库后端.我也设计和构建数据库.我已经使用L2S成功了几次.

考虑到这一点,有人能给我一个引人注目的理由来使用EF而不是L2S吗?

我在本周末在代码营,经过一个小时的EF演示,所有这些都可以在L2S中完成,我问了同样的问题.演讲者的答案是,“L2S死了…”很好!不! (see here)

我明白EF是我们以后要使用的MS(see here),它提供了更多的定制选项.我无法想像的是,如果在这种环境中,任何一个或那个对我来说都是重要的.

我们在这里遇到的一个特别的问题是我继承了基于4个不同sql数据库的Core App. L2S有很大困难,但是当我问上述演讲者时,EF会帮助我在这方面他说“不!”

解决方法

使用EF,您可以在类对象和数据库表之间获取映射图层(即您的实体).如果您需要这种灵活性,或者喜欢 domain-driven design型号(而不是桌面设计),则EF可能值得考虑. Linq to sql几乎是一个类到表的映射器.

c# – LINQ或Entity Framework创建无界的SQL语句

c# – LINQ或Entity Framework创建无界的SQL语句

我正在研究我的应用程序的速度优化,我发现LINQ(或EF)正在为我创建一些工作缓慢的奇怪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提前!

解决方法

你没有说_DatabaseView是什么,但根据你的结果我的猜测是它不是一个ObjectQuery< T>.这可以解释你的问题. ObjectQuery将转换为sql; IEnumerable< T> .Skip()不会.在可枚举上调用AsQueryable()不足以实现这一点.

例如,这个:

var foo = MyObjectContext.someEntitySet.AsEnumerable().AsQueryable().Take(10);

…不会把TOP放在sql中.

但是这个:

var bar = MyObjectContext.someEntitySet.Take(10);

……会的.

再一次:你还没有说_DatabaseView是什么.直接在ObjectContext上尝试此操作,您将看到它的工作原理.该错误位于用于分配_DatabaseView的代码中,您尚未向我们展示.

c# – 在Entity Framework中使用简单查询,性能非常差

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);

然后为列表中的每个对象调用所述查询.但即便采用这种方法也需要一分钟.那么我如何在合理的时间范围内实现这一目标呢?

此外,我很抱歉这个过长的解释,但希望有人可以帮助我!

解决方法

尽量减少数据库调用的次数.根据经验,每个人至少需要大约10毫秒 – 即使只返回一个标量.

因此,通常,一次性获取您需要的所有数据,在代码中修改它然后保存它.

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中使用简单查询,性能非常差等更多相关知识的信息可以在本站进行查询。

本文标签: