Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在表上的Lambda Where()中使用联接的任何方法<>;?_C#_.net_Linq - Fatal编程技术网

C# 在表上的Lambda Where()中使用联接的任何方法<>;?

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

我在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.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页面的链接,这样您就可以看到替代语法。