C# 在表上的Lambda Where()中使用联接的任何方法<>;?
我在C#中使用Linq的头几天,我很想知道是否有更简洁的方法来编写下面的内容C# 在表上的Lambda Where()中使用联接的任何方法<>;?,c#,.net,linq,C#,.net,Linq,我在C#中使用Linq的头几天,我很想知道是否有更简洁的方法来编写下面的内容 MyEntities db = new MyEntities(ConnString); var q = from a in db.TableA join b in db.TableB on a.SomeFieldID equals b.SomeFieldID where (a.UserID == CurrentUser && b.MyF
MyEntities db = new MyEntities(ConnString);
var q = from a in db.TableA
join b in db.TableB
on a.SomeFieldID equals b.SomeFieldID
where (a.UserID == CurrentUser &&
b.MyField == Convert.ToInt32(MyDropDownList.SelectedValue))
select new { a, b };
if(q.Any())
{
//snip
}
我知道,如果我想检查单个表的字段中是否存在值,我可以使用以下方法:
if(db.TableA.Where(u => u.UserID == CurrentUser).Any())
{
//snip
}
但是我很想知道是否有一种方法可以实现lambda技术,但是它在哪能满足第一种技术在这两个表中的条件
抱歉,有任何错误或清晰,我会根据需要进行编辑。提前感谢。是的,您可以使用方法来完成此操作。请注意,通过先筛选每个表,您可能会得到更简洁的查询,尽管我怀疑SQL Server无论如何都会以这种方式对其进行优化
if (db.TableA.Where( a => a.UserID == CurrentUser )
.Join( db.TableB.Where( b => b.MyField == Convert.ToInt32(MyDDL.SelectedValue) ),
o => o.someFieldID,
i => i.someFieldID,
(o,i) => o )
.Any()) {
...
}
我认为您应该将“Convert.ToInt32(MyDropDownList.SelectedValue)”移到局部变量。是的,有(参见tvanfosson的帖子),但是,我相信您编写的代码更容易理解。就我个人而言,如果我必须使用连接,我宁愿不使用函数Linq方法。@Andrew为什么要将其移动到局部变量?可读性@Obalix-我倾向于同意,但我觉得这可能是因为我对语法的理解不全面。在我更好地理解发生了什么以及何时使用什么之后,我有一种感觉,我会更喜欢函数式方法。因为如果移到局部变量,值将从下拉列表中提取并多次转换为Int32,而不是一次。还有可读性。@Andrew,是的,如果它在循环或稀有方法中,我会这样做。我从上面的代码中得到一个异常,声明“没有重载方法'Join'接受'2'参数”。@lush--对不起,我的签名错了。它需要两个键选择器(外部和内部),然后是结果选择器。在本例中,我只是选择了外部对象,因为它最终将被转换为ANY查询。我还为join扩展方法添加了一个指向MSDN页面的链接,这样您就可以看到替代语法。