新手碰到entityframework6教程版本冲突,求教

新手碰到EntityFramework版本冲突,求教_百度知道
新手碰到EntityFramework版本冲突,求教
baidu.jpg" esrc="/zhidao/wh%3D450%2C600/sign=5effa91a546bdab5bc315c2d0dcc6d://f.com/zhidao/pic/item/34a8ab332d0dcc6d.baidu参考解决方法.hiphotos.hiphotos.hiphotos.baidu.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http:然后找到那个 EntityFramework 升级一下://f.com/zhidao/wh%3D600%2C800/sign=ccdea71bf83f/34a8ab332d0dcc6d
其他类似问题
为您推荐:
其他1条回答
public class test { public static void main(String[] args)throws Exception { int[] b=new int[200]. im
int[] c=new int[200].BufferedReader, j.InputStreamReader.io.in)); String str=
BufferedReader br=new BufferedReader(new InputStreamReader(System
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁自从我用了EF,每次都很关心是否有潜在的性能问题。所以每次我写LINQ查询,都会使用SQL Profiler看一下实际生成的SQL语句,以便发现潜在的性能问题。也强烈建议大家这么去做,以免日后软件大了出了问题很难查。
一、只选择某列或某些列
有些时候,在C#里写LINQ虽然看着舒服,但性能不一定好,所以有必要做一些调整。比如这种情况:
我需要知道一篇文章的点击数,仅此而已,我可能会写:
context.Post.FirstOrDefault(p =& p.Id == postId).H
context.Post.Find(postId).H
我期待着他们只去数据库里筛选Hits这一列的数据,然而,通过SQL Profiler会发现,这两条语句居然把全部列都给select出来了,访问Hits的操作实际是在内存中进行的。
虽然小表看不出性能问题,但万一你的表里有一列是存文件字节流(byte)的,那这样的操作可能会很慢,并且消耗额外的网络传输,所以不能忽视这个问题。
其实,我只要稍作调整,就能避免这个问题,但会LINQ语句难看一点:
context.Post.Where(p =& p.Id == postId).Select(p =& p.Hits).FirstOrDefault();
LINQ to SQL最终生成的native sql是这样的:
exec sp_executesql N'SELECT TOP (1)
[Extent1].[Hits] AS [Hits]
FROM [dbo].[Post] AS [Extent1]
WHERE [Extent1].[Id] = @p__linq__0',N'@p__linq__0 uniqueidentifier',@p__linq__0='850C3A86-6C3D-408B-8099-61EDA559F804'
真正的只select了Hits一个字段。
二、ToList()的问题
其实EF很多时候的性能问题都是关系到查询执行时机的。我们通常的意图是,首先建立一个查询表达式,只是build,而不execute。执行的时机是用到这个表达式结果的时候才去执行。
在公司码程序的时候,我看到好多同事用EF,写完查询喜欢直接调用ToList()方法。有时候这会造成很大的性能问题。因为单纯声明一个linq表达式并不会立即执行SQL查询,然而一旦在后面加上ToList(),就会立即去执行。如果你只是想根据条件选择其中一些数据,而非全部的话,那ToList()以后再筛选,就是从内存里执行了,并不是把你的条件转换成sql的where语句去执行。
var query = from ..... // 建立查询,但不执行
var result = query.ToList(); // 立即执行查询
所以,你应当尽量避免从ToList()后的结果中再去查找自己想要的元素。
三、IQueryable, IEnumerable
在这两个接口的选择上,我偏向使用IQueryable。大部分时候这两个接口在使用上的表现都是一致的,但如果你要做的是一个不确定的查询,意思是这个查询表达式不是一次性确定的,对于它的结果可能由别的类来选择到底select哪些东西,这时候就要用IQueryable。
比如我有一个数据层方法:
public IEnumerable&EdiBlog.Core.Entities.Post& GetAllPost()
return context.P
很显然,它会被系统中的其他方法调用,而这些调用者希望得到的结果都各不相同。通常的操作就是再拼一个where语句上去:
var myResult = postDa.GetAllPost().Where(...)
但这时,很不幸的是,where语句中的条件并不是转换为native sql去执行的,它是在内存中筛选的。这是一个比较阴的性能问题。所以文章一开始我就建议大家多用SQL Profiler看看自己的LINQ是怎么执行的。
如果把返回类型换成IQueryable,那么你的where语句就可以转化为SQL执行。
public IQueryable&EdiBlog.Core.Entities.Post& GetAllPost()
return context.P
关于这两个接口,在屌丝论坛StackOverflow上有一个比较好的帖子,大家可以自己看一下:
&IEnumerable: IEnumerable is best suitable for working with in-memory collection. IEnumerable doesn&t move between items, it is forward only collection.
IQueryable: IQueryable best suits for remote data source, like a database or web service. IQueryable is a very powerful feature that enables a variety of interesting deferred execution scenarios (like paging and composition based queries).&
在MSDN论坛上也有个比较直观的答案:
IQueryable returns a "queryable" that is a query you could still be enriched before really sending it to the server.
IEnumerable returns a list that is the actual querying took place and you get the results. ToList is isued to force running the query and returning these enumerable results...
So in short : - use IQueryable if you want to return a base query that could be further&enhanced before running it server side (by enumerating its items).. - use IEnumerable/ToList if you want to return a list that has been retrieved from the db
四、计算个数,Count()和Count
这个是最容易被坑,也是非常严重的一个性能问题。当我们需要统计符合某条件的记录的条数时,我们希望SQL语句是SELECT COUNT(*) ... 这种形式的。然而下面这个看似很自然的写法却会导致不希望的结果:
context.Category.FirstOrDefault(p =& p.Name == categoryName).Posts.C
这是我博客里用来统计某分类下文章数目的语句,当然,因为发现性能问题,现在已经不是这么写了。它产生的SQL并不是SELECT COUNT,而是分成2条。下面是SQL Profiler抓到的:
exec sp_executesql N'SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[DisplayName] AS [DisplayName]
FROM [dbo].[Category] AS [Extent1]
WHERE [Extent1].[Name] = @p__linq__0',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'ASPNET'
exec sp_executesql N'SELECT
[Extent2].[Id] AS [Id],
[Extent2].[Title] AS [Title],
[Extent2].[Slug] AS [Slug],
[Extent2].[PubDate] AS [PubDate],
[Extent2].[PostContent] AS [PostContent],
[Extent2].[Author] AS [Author],
[Extent2].[CommentEnabled] AS [CommentEnabled],
[Extent2].[IsPublished] AS [IsPublished],
[Extent2].[Hits] AS [Hits],
[Extent2].[Rators] AS [Rators],
[Extent2].[Rating] AS [Rating],
[Extent2].[ExposedToSiteMap] AS [ExposedToSiteMap],
[Extent2].[DisplayFrom] AS [DisplayFrom],
[Extent2].[DisplayTill] AS [DisplayTill],
[Extent2].[LastModifyOn] AS [LastModifyOn],
[Extent2].[PublishToRss] AS [PublishToRss]
[dbo].[PostCategory] AS [Extent1]
INNER JOIN [dbo].[Post] AS [Extent2] ON [Extent1].[PostId] = [Extent2].[Id]
WHERE [Extent1].[CategoryId] = @EntityKeyValue1',N'@EntityKeyValue1 uniqueidentifier',@EntityKeyValue1='3FEB11A2-6E36-4DCE-8C02-614BEF7ACC62'
可以看到,EF做了两件事,第一件事是查找Name为"ASPNET"的Category,然后用这个Category的Id去找它所有的Post,最后做Count的其实是.NET在内存里进行的。这显然把我们不需要的信息都给SELECT出来了。我们只需要一个Count,为毛会这么复杂呢?
回顾第一条我所讲过的。不难发现。在FirstOrDefault(...)之后访问的属性,都是在内存里进行的。所以,当我们访问Category.FirstOrDefault(p =& p.Name == categoryName)的时候,就生成了第一条SQL语句。紧跟其后的&.Posts&是Category对象的导航属性,EF会用lazy load去加载这个category所有的post,所以就生成了第二条SQL语句。再紧接其后的Count就自然而然在内存里进行了。
如果要让代码尽量去生成LINQ to SQL,有个很简单的原则,就是尽量用LINQ、Lambda表达式,这样EF才可能帮我们翻译。C#里的Count有两种。Enumerable.Count()是方法,List.Count是属性。一旦一个东西变成了List,你再去Count,就必定是在内存里进行的了。
所以,在EF中,要进行Count操作,应该这样写:
context.Post.Count(p =& p.Categories.Any(q =& q.Name == categoryName));
这时,Count()接受了一个lambda表达式,LINQ to SQL就能准确翻译为&SELECT COUNT&了:
SELECT [GroupBy1].[A1]
SELECT COUNT(1)
[dbo].[Post]
AS [Extent1]
SELECT 1 AS [C1]
[dbo].[PostCategory] AS [Extent2]
INNER JOIN [dbo].[Category] AS [Extent3]
[Extent3].[Id] = [Extent2].[CategoryId]
([Extent1].[Id] = [Extent2].[PostId])
AND ([Extent3].[Name] = 'ASPNET')
AS [GroupBy1]
现在性能要明显好很多~
Thanks For Your Rating
Discover -> Scan QR Code
& 2009 - 2016 Edi.Wang新手碰到EntityFramework版本冲突,求教_百度知道
新手碰到EntityFramework版本冲突,求教
,然后可以用返回的部分UID防冲突(执行防冲突(9320)后.等),并在对应寄存器标识哪位冲突了,将返回完整UID,若没有冲突.,这里称为防冲突循环,然后选卡(9370)若有冲突了,将返回部分UID(开始位到冲突位),直到返回完整UID后选卡(9370)
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁EFCodeFirst安装失败(包含EntityFrameWork安装)解决方案
今天在安装EFCodeFirst包时出现 This package or one of
this dependencies contains PowerShell scripts and needs to be
installed from the pAckage Manager Console 因为用的是WIN7
EntityFrameWork补丁也没有安装成功 然后在网上找到了这篇文章
我把它放在这里下次如果遇到同样的问题可以快速的...
  今天在安装EFCodeFirst包时出现“This package (or one of this
dependencies) contains PowerShell scripts and needs to be installed
from the pAckage Manager Console.”。因为用的是WIN7
EntityFrameWork补丁也没有安装成功、然后在网上找到了这篇文章、我把它放在这里下次如果遇到同样的问题可以快速的找到解决办法。
  第一步(对象
-& Library Package Manager -& Add
Library Package Reference...):
  第二步查找一下:
  第三步就杯剧了:
看到了传说的“This package (or one of this dependencies) contains
PowerShell scripts and needs to be installed the pAckage Manager
Console.”
  去官网找补丁、、百度、、废了好长时间、终于找到了解决办法
  第一步,不消可视化,直接找号令:
  点击它,进入号令行。。。目标在最下方的那个框子里。。。
  首先,我们先要找须要的包,输入“get-package -remote -filter
entityframework”。。。
  我看网上的都是先安装EntityFrameWork,不知道为什么我安不了,所以就直接也一块说一下。
  好了,如今我们输入完后,一回车,将会呈现如下,有一大堆数据的列表。。。
  这里,我们要重视两行,一个是Id,一个是Version。Id是用于指出什么包,Version是对应的版本。我们从表中可以看出。有很多包是同名的,然则版本不合。是以,碰到两个及两个以上包名雷同的包,除了用Id指出来外,还要经由过程Version来圈字哪一个他。不是那个他,而是这个他。
  因而,我们若是要安装包,就要有两个参数,一个是Id,一个是Version。
  好,格局如下:
  install-package -id 包名 -Version 版本
  那么,我们要输入的就是:
  install-package -id EntityFramework -Version 4.1.10331.0
  OK,输入后执行。。。
  好、安装成功。下面就要安装EFCode
  输入号令:install-package -id EFCodeFirst -Version 1.1
  OK、EFCode也已经安装完毕
  Visual Studio会打开一个TXT子窗口、内容如下:
    我们重启VS后打开可视化界面中的景象:
  OK!大功告成!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 entityframework 教程 的文章

 

随机推荐