日期:2014-05-20  浏览次数:20717 次

小白来求助,Linq用在哪里比较好呢?
我是Linq小白,刚跟着视频看了看。

我现在有一个工程,里面有建立Hierarchy treeview得东西,目前都是dataset通过存储过程从数据库中读取,然后根据parent<-->child的关系装载在一个treeview上面。

如果我的应用是这样的,Linq会帮助到我么?它的开发速度和效率会不会比我现在的方法高呢?

对我来说Linq是新技术,但是我的困惑是不知道把它用在什么地方才算有的放矢。

希望各位多多提意见,谢谢

端午愉快

------解决方案--------------------
探讨

忘记说了,我的工程里面没有in line sql,都是写在存储过程里面的。

目前用统一的函数调用,代码量并不大。

如果不连接sql数据库的话,linq还有什么比较广的用途?

我现在有一个类objA,里面有一个属性Height;一个对于objA的collection;我是不是可以通过linq对于这个collection直接搜索找到最大Height的那个objA呢?

------解决方案--------------------
LINQ2SQL在映射.DBML文件时 可一同将存储过程映射成相应的方法
可在代码中直接调用

返回DataSet后,可通过LINQ2DataTable+递归 来实现树级结构
------解决方案--------------------
探讨

忘记说了,我的工程里面没有in line sql,都是写在存储过程里面的。

目前用统一的函数调用,代码量并不大。

如果不连接sql数据库的话,linq还有什么比较广的用途?

我现在有一个类objA,里面有一个属性Height;一个对于objA的collection;我是不是可以通过linq对于这个collection直接搜索找到最大Height的那个objA呢?

------解决方案--------------------
不用也没关系
------解决方案--------------------
我想最有可能想到能用LINQ的情况是:

当你要用foreach遍历的时候
------解决方案--------------------
哪都用。
------解决方案--------------------
想到 集合 ,你就要想到linq了,用的广!
------解决方案--------------------
我本人不太喜欢用linq操作数据库,一个是跨数据库的问题,另一个是扩展比较麻烦。
我觉得linq to object、linq to xml是很好的。
------解决方案--------------------
集合

List<T>

Dictionary<TKey, TValue>
------解决方案--------------------
从微软下载LINQ示例
101个LINQ查询示例
101个Linq to sql
101个linq to xml
------解决方案--------------------
下完学习一下,就知道Linq哪好用了

------解决方案--------------------
如果你有想写 for,或者 foreach 的时候,你就可以考虑用 linq 来写了。
------解决方案--------------------
探讨
我是Linq小白,刚跟着视频看了看。

我现在有一个工程,里面有建立Hierarchy treeview得东西,目前都是dataset通过存储过程从数据库中读取,然后根据parent<-->child的关系装载在一个treeview上面。

如果我的应用是这样的,Linq会帮助到我么?它的开发速度和效率会不会比我现在的方法高呢?

对我来说Linq是新技术,但是我的困惑是不知道把它用在……

------解决方案--------------------
基本上,是一种启发和推荐,因为它写出来的代码比较倾向于算法,而不是实现细节。比如这样的代码:
C# code
var pixelsQuery = from y in Enumerable.Range(0, screenHeight).AsParallel().WithDegreeOfParallelism(parallel ? 2 : 1)
                    let recenterY = -(y - (screenHeight / 2.0)) / (2.0 * screenHeight)
                    select from x in Enumerable.Range(0, screenWidth)
                            let recenterX = (x - (screenWidth / 2.0)) / (2.0 * screenWidth)
                            let point =
                                Vector.Norm(Vector.Plus(scene.Camera.Forward,
                                                        Vector.Plus(Vector.Times(recenterX, scene.Camera.Right),
                                                                    Vector.Times(recenterY, scene.Camera.Up))))
                            let ray = new Ray() { Start = scene.Camera.Pos, Dir = point }
                            let computeTraceRay = (Func<Func<TraceRayArgs, Color>, Func<TraceRayArgs, Color>>)
                            (f => traceRayArgs =>
                            (from isect in
                                from thing in traceRayArgs.Scene.Things
                                select thing.Intersect(traceRayArgs.Ray)
                            where isect != null
                            orderby isect.Dist
                            let d = isect.Ray.Dir
                            let pos = Vector.Plus(Vector.Times(isect.Dist, isect.Ray.Dir), isect.Ray.Start)
                            let normal = isect.Thing.Normal(pos)
                            let reflectDir = Vector.Minus(d, Vector.Times(2 * Vector.Dot(normal, d), normal))
                            let naturalColors =
                                from light in traceRayArgs.Scene.Lights
                                let ldis = Vector.Minus(light.Pos, pos)
                                let livec = Vector.Norm(ldis)
                                let testRay = new Ray() { Start = pos, Dir = livec }
                                let testIsects = from inter in
                                                        from thing in traceRayArgs.Scene.Things
                                                        select thing.Intersect(testRay)
                                                    where inter != null
                                                    orderby inter.Dist
                                                    select inter
                                let testIsect = testIsects.FirstOrDefault()
                                let neatIsect = testIsect == null ? 0 : testIsect.Dist
                                let isInShadow = !((neatIsect > Vector.Mag(ldis)) || (neatIsect == 0))
                                where !isInShadow
                                let illum = Vector.Dot(livec, normal)
                                let lcolor = illum > 0 ? Color.Times(illum, light.Color) : Color.Make(0, 0, 0)
                                let specular = Vector.Dot(livec, Vector.Norm(reflectDir))
                                let scolor = specular > 0
                                                ? Color.Times(Math.Pow(specular, isect.Thing.Surface.Roughness),
                                                                light.Color)
                                                : Color.Make(0, 0, 0)
                                select Color.Plus(Color.Times(isect.Thing.Surface.Diffuse(pos), lcolor),
                                                    Color.Times(isect.Thing.Surface.Specular(pos), scolor))
                            let reflectPos = Vector.Plus(pos, Vector.Times(.001, reflectDir))
                            let reflectColor = traceRayArgs.Depth >= MaxDepth
                                                ? Color.Make(.5, .5, .5)
                                                : Color.Times(isect.Thing.Surface.Reflect(reflectPos),
                                                                f(new TraceRayArgs(new Ray()
                                                                {
                                                                    Start = reflectPos,
                                                                    Dir = reflectDir
                                                                },
                                                                                    traceRayArgs.Scene,
                                                                                    traceRayArgs.Depth + 1)))
                            select naturalColors.Aggregate(reflectColor,
                                                            (color, natColor) => Color.Plus(color, natColor))
                            ).DefaultIfEmpty(Color.Background).First())
                            let traceRay = Y(computeTraceRay)
                            select new { X = x, Y = y, Color = traceRay(new TraceRayArgs(ray, scene, 0)) };