我在使用LINQ和Lambda编写的查询时遇到问题。 到目前为止,我的代码中出现了很多错误:

int id = 1;
var query = database.Posts.Join(database.Post_Metas,post => database.Posts.Where(x => x.ID == id),meta => database.Post_Metas.Where(x => x.Post_ID == id),(post, meta) => new { Post = post, Meta = meta });

我是新手使用LINQ,所以我不确定这个查询是否正确。


#1楼

我发现,如果您熟悉SQL语法,那么使用LINQ查询语法会更清晰,更自然,并且更容易发现错误:

var id = 1;
var query =from post in database.Postsjoin meta in database.Post_Metas on post.ID equals meta.Post_IDwhere post.ID == idselect new { Post = post, Meta = meta };

如果你真的坚持使用lambdas,你的语法有点偏。 这是使用LINQ扩展方法的相同查询:

var id = 1;
var query = database.Posts    // your starting point - table in the "from" statement.Join(database.Post_Metas, // the source table of the inner joinpost => post.ID,        // Select the primary key (the first part of the "on" clause in an sql "join" statement)meta => meta.Post_ID,   // Select the foreign key (the second part of the "on" clause)(post, meta) => new { Post = post, Meta = meta }) // selection.Where(postAndMeta => postAndMeta.Post.ID == id);    // where statement

#2楼

您的密钥选择器不正确。 他们应该采用相关表格类型的对象,并返回要在连接中使用的密钥。 我想你的意思是:

var query = database.Posts.Join(database.Post_Metas,post => post.ID,meta => meta.Post_ID,(post, meta) => new { Post = post, Meta = meta });

您可以在之后应用where子句,而不是作为键选择器的一部分。


#3楼

你可以用两种方式。 使用LINQPad (如果您是LINQ的新手,这是非常宝贵的)和虚拟数据库,我构建了以下查询:

Posts.Join(Post_metas,post => post.Post_id,meta => meta.Post_id,(post, meta) => new { Post = post, Meta = meta }
)

要么

from p in Posts
join pm in Post_metas on p.Post_id equals pm.Post_id
select new { Post = p, Meta = pm }

在这种特殊情况下,我认为LINQ语法更清晰(我在两者之间进行了更改,具体取决于最容易阅读的内容)。

我想指出的是,如果你的数据库中有适当的外键(post和post_meta之间),那么你可能不需要显式连接,除非你试图加载大量的记录。 您的示例似乎表明您正在尝试加载单个帖子及其元数据。 假设每个帖子都有很多post_meta记录,那么您可以执行以下操作:

var post = Posts.Single(p => p.ID == 1);
var metas = post.Post_metas.ToList();

如果你想避免n + 1问题,那么你可以明确地告诉LINQ to SQL一次性加载所有相关项目(尽管这可能是你更熟悉L2S时的一个高级主题)。 下面的示例说明“当您加载Post时,还会通过'Post_metas'属性表示的外键加载与其关联的所有记录”:

var dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<Post>(p => p.Post_metas);var dataContext = new MyDataContext();
dataContext.LoadOptions = dataLoadOptions;var post = Posts.Single(p => p.ID == 1); // Post_metas loaded automagically

对于相同类型或许多不同类型,可以在单个DataLoadOptions集上进行许多LoadWith调用。 如果你这么做,你可能只想考虑缓存。


#4楼

它可能是这样的

var myvar = from a in context.MyEntityjoin b in context.MyEntity2 on a.key equals b.keyselect new { prop1 = a.prop1, prop2= b.prop1};

#5楼

发布是因为当我开始LINQ + EntityFramework时,我盯着这些例子一天。

如果您正在使用EntityFramework,并且在Post模型对象设置上有一个名为Meta的导航属性,那么这很容易。 如果您正在使用实体并且没有该导航属性,您还在等什么?

database.Posts.Where(post => post.ID == id).Select(post => new { post, post.Meta });

如果你先做代码,你就这样设置了属性:

class Post {[Key]public int ID {get; set}public int MetaID { get; set; }public virtual Meta Meta {get; set;}
}

#6楼

Daniel对语法关系有一个很好的解释,但我把这个文档放在我的团队中,以便让他们更容易理解。 希望这有助于某人


#7楼

这个linq查询应该适合你。 它将获得所有发布元的帖子。

var query = database.Posts.Join(database.Post_Metas,post => post.postId, // Primary Keymeta => meat.postId, // Foreign Key(post, meta) => new { Post = post, Meta = meta });

等效的SQL查询

Select * FROM Posts P
INNER JOIN Post_Metas pm ON pm.postId=p.postId

#8楼

我做过这样的事情;

var certificationClass = _db.INDIVIDUALLICENSEs.Join(_db.INDLICENSECLAsses,IL => IL.LICENSE_CLASS,ILC => ILC.NAME,(IL, ILC) => new { INDIVIDUALLICENSE = IL, INDLICENSECLAsse = ILC }).Where(o => o.INDIVIDUALLICENSE.GLOBALENTITYID == "ABC" &&o.INDIVIDUALLICENSE.LICENSE_TYPE == "ABC").Select(t => new{value = t.PSP_INDLICENSECLAsse.ID,name = t.PSP_INDIVIDUALLICENSE.LICENSE_CLASS,                }).OrderBy(x => x.name);

#9楼

1等于1两个不同的表连接

var query = from post in database.Postsjoin meta in database.Post_Metas on 1 equals 1where post.ID == idselect new { Post = post, Meta = meta };

加入/ LINQ和Lambda的位置相关推荐

  1. SQL、Linq和Lambda表达式 的关系

    首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询 ...

  2. SQL、LINQ、Lambda 三种用法(转)

    SQL.LINQ.Lambda 三种用法 颜色注释: SQL LinqToSql Lambda QA 1. 查询Student表中的所有记录的Sname.Ssex和Class列. select sna ...

  3. 理解Linq和lambda

    ******************理解Linq和lambda*********************** using System; using System.Collections.Generi ...

  4. C# 3.0通过Linq、Lambda、匿名函数、代理函数实现数据查询

    这几天,正在学习Linq.Lambda,做了些实验,通过Linq.Lambda.匿名函数.代理函数4种方式实现一个简单的查询,把实现结果记录一下,以免忘记.       这段代码中有一个Person类 ...

  5. R语言使用glmnet包拟合lasso-cox回归模型(生存时间和结果标签)、lasso-cox模型进行特征筛选、plot函数可视化cv.glmnet模型获得的最佳lambda曲线位置及其1个标准差线

    R语言使用glmnet包拟合lasso-cox回归模型(包含生存时间和结果标签).使用lasso-cox模型进行特征筛选.plot函数可视化cv.glmnet模型获得的最佳lambda曲线位置及其1个 ...

  6. linq和lambda_最小起订量:应用于模拟对象的Linq,Lambda和谓词

    linq和lambda Kzu and friends have a new pet project called Moq, which may be the coolest derivative o ...

  7. APS.NET MVC + EF (01)---Linq和Lambda表达式

    APS.NET MVC + EF (01)---Linq和Lambda表达式 1.1 Linq介绍 LINQ全称 Language Integrated Query(语言集成查询).为我们提供一种统一 ...

  8. Linq和Lambda学习

    Linq:在数据库中,可以使用sql语句进行查询数据.在C#程序中,我们可以得到数据后,使用linq进行查询.包括LINQ to Objects.LINQ to SQL.LINQ to Dataset ...

  9. Linq之Lambda表达式初步认识

    目录 写在前面 匿名方法 一个例子 Lambda 定义 一个例子 总结 参考文章 写在前面 元旦三天在家闲着无事,就看了看Linq的相关内容,也准备系统的学习一下,作为学习Linq的前奏,还是先得说说 ...

最新文章

  1. 2022-2028年中国白手套行业市场全景调查及发展前景分析报告
  2. 【DD推荐】还用翻译工具给参数和方法取名?装个插件快速搞定!
  3. matlab 自适应噪声对消,基于Matlab的RLS自适应语音噪声对消系统的设计与实现
  4. 飞秋-程序的找工作之苦
  5. 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理
  6. Mysql查询语句练习题
  7. Codeforces Round #159 (Div. 2)
  8. gps 数据解析-NMEA 0183协议
  9. 锂电池电源管理系统设计与实现(单片机)
  10. python猜拳小游戏
  11. 【VUE】浏览器消息通知(声音提醒,标题栏闪动,弹框提醒)
  12. Linux 定时发送邮箱
  13. MogaFX—日元兑美元30多年来首次突破150日元
  14. 控制与决策latex排版解答
  15. searchsploit 漏洞搜索
  16. 以太坊系列---ipc实现方式---管道通信库npipe
  17. linux hdmi输出快捷键,Linux 下的投影仪 HDMI 输出设置
  18. creator 跳跃弧线_CocosCreator零基础制作游戏《极限跳跃》教程1
  19. iOS 用内置浏览器Safari 打开网页
  20. 分布式系列之分布式计算框架Flink深度解析

热门文章

  1. Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF)
  2. 在Service中通过WindowManger添加View的方式来把UI界面显示出来
  3. Android 线程死锁的案例
  4. Android消息处理:EventBus、BroadCast和Handler-优缺点比较
  5. 走进STM32世界之Hex程序烧写
  6. 微信小程序 解决请求服务器手机预览请求不到数据的方法
  7. C语言程序设计模拟卷,C语言程序设计(上)模拟卷
  8. python 提取网关信息_python:使用netifaces模块获取本机IP网关等信息
  9. 线程池之SingleThreadPool学习
  10. 仿中国比特币首页趋势图,折线图,k线图